]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Align get feature data buffer length by page size to allocate
authorTokunori Ikegami <ikegami.t@gmail.com>
Mon, 27 Feb 2023 16:23:01 +0000 (01:23 +0900)
committerDaniel Wagner <wagi@monom.org>
Wed, 1 Mar 2023 11:08:53 +0000 (12:08 +0100)
Since a memory error caused by some features as data corrupted over length.
Also the issue can be resolved by the change to align the data length.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme.c

diff --git a/nvme.c b/nvme.c
index b068a932b45ced22d8f97a25b5588fe0a3859ce5..922616051affb3ec4cd245411c57f4a122ebd189 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -4502,6 +4502,8 @@ ret:
 static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg,
                          void **buf, __u32 *result)
 {
+       size_t size;
+
        if (!cfg->data_len)
                nvme_get_feature_length(cfg->feature_id, cfg->cdw11,
                                        &cfg->data_len);
@@ -4519,10 +4521,11 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg,
                cfg->data_len = 0;
 
        if (cfg->data_len) {
-               if (posix_memalign(buf, getpagesize(), cfg->data_len)) {
+               /* rounding up size to page size */
+               size = ((cfg->data_len - 1) / getpagesize() + 1) * getpagesize();
+               if (posix_memalign(buf, getpagesize(), size))
                        return -1;
-               }
-               memset(*buf, 0, cfg->data_len);
+               memset(*buf, 0, size);
        }
 
        struct nvme_get_features_args args = {