[PATCH 02/17] nvme-tcp: check for invalidated or revoked key
Hannes Reinecke
hare at kernel.org
Mon Mar 18 08:03:01 PDT 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 0141c0a6942f..75aa69457353 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -639,7 +639,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 6c7f1d5c056f..ec581608f16c 100644
--- a/drivers/nvme/host/sysfs.c
+++ b/drivers/nvme/host/sysfs.c
@@ -671,10 +671,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 a6d596e05602..4a58886e1354 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