[PATCH 07/13] nvme-tcp: check for invalidated or revoked key
hare at kernel.org
hare at kernel.org
Sat Jan 27 01:30:52 PST 2024
From: Hannes Reinecke <hare at suse.de>
key_lookup() will always return a key, even if that key is revoked
or invalidated. So check for invalid keys before continuing.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
drivers/nvme/host/fabrics.c | 7 ++++++-
drivers/nvme/host/sysfs.c | 9 +++++++--
drivers/nvme/host/tcp.c | 8 +++++++-
3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index aa88606a44c4..a7da088331dc 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -635,7 +635,12 @@ static struct key *nvmf_parse_key(int key_id)
key = key_lookup(key_id);
if (!IS_ERR(key))
pr_err("key id %08x not found\n", key_id);
- else
+ else if (test_bit(KEY_FLAG_REVOKED, &key->flags) ||
+ test_bit(KEY_FLAG_INVALIDATED, &key->flags)) {
+ pr_err("key id %08x invalid\n", key_id);
+ key_put(key);
+ key = ERR_PTR(-EKEYREVOKED);
+ } else
pr_debug("Using key id %08x\n", key_id);
return key;
}
diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c
index 754e91111042..1076b5b59b35 100644
--- a/drivers/nvme/host/sysfs.c
+++ b/drivers/nvme/host/sysfs.c
@@ -617,10 +617,15 @@ static ssize_t tls_key_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
+ struct key *key = ctrl->tls_key;
- if (!ctrl->tls_key)
+ if (!key)
return 0;
- return sysfs_emit(buf, "%08x", key_serial(ctrl->tls_key));
+ if (test_bit(KEY_FLAG_REVOKED, &key->flags) ||
+ test_bit(KEY_FLAG_INVALIDATED, &key->flags))
+ return -EKEYREVOKED;
+
+ return sysfs_emit(buf, "%08x", key_serial(key));
}
static DEVICE_ATTR_RO(tls_key);
#endif
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index c160b1a64ec0..65d9a817e752 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1571,9 +1571,15 @@ static void nvme_tcp_tls_done(void *data, int status, key_serial_t pskid)
tls_key = key_lookup(pskid);
if (IS_ERR(tls_key)) {
- dev_warn(ctrl->ctrl.device, "queue %d: Invalid key %x\n",
+ dev_warn(ctrl->ctrl.device, "queue %d: key %08x not found\n",
qid, pskid);
queue->tls_err = -ENOKEY;
+ } else if (test_bit(KEY_FLAG_REVOKED, &tls_key->flags) ||
+ test_bit(KEY_FLAG_INVALIDATED, &tls_key->flags)) {
+ dev_warn(ctrl->ctrl.device, "queue %d: key %08x invalid\n",
+ qid, pskid);
+ key_put(tls_key);
+ queue->tls_err = -EKEYREVOKED;
} else {
ctrl->ctrl.tls_key = tls_key;
queue->tls_err = 0;
--
2.35.3
More information about the Linux-nvme
mailing list