]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: add lsp and uuid index invalid value checks in get log
authorGollu Appalanaidu <anaidu.gollu@samsung.com>
Thu, 27 May 2021 06:23:40 +0000 (11:53 +0530)
committerDaniel Wagner <dwagner@suse.de>
Mon, 15 Nov 2021 11:06:28 +0000 (12:06 +0100)
Add the invalid LSP and UUID Index value checks as per the field
lengths. Refactor the get_log function.

Signed-off-by: Gollu Appalanaidu <anaidu.gollu@samsung.com>
[dwagner: updated context in get_log() and error handling]
Signed-off-by: Daniel Wagner <dwagner@suse.de>
nvme.c

diff --git a/nvme.c b/nvme.c
index 8542805afde6e3cc1f79568457c274a25c8bb3b0..81d7db1c504f37e23ae574193941455d5bd0da41 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -1286,6 +1286,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
        const char *raw = "output in raw format";
        const char *uuid_index = "UUID index";
        int err, fd;
+       unsigned char *log;
 
        struct config {
                __u16 lsi;
@@ -1335,36 +1336,48 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
        }
 
        if (!cfg.log_len) {
-               fprintf(stderr, "non-zero log-len is required param\n");
+               perror("non-zero log-len is required param\n");
                err = -EINVAL;
-       } else {
-               unsigned char *log;
+               goto close_fd;
+       }
 
-               log = malloc(cfg.log_len);
-               if (!log) {
-                       perror("could not alloc buffer for log\n");
-                       err = -ENOMEM;
-                       goto close_fd;
-               }
+       if (cfg.lsp > 16) {
+               perror("invalid lsp param\n");
+               err = -EINVAL;
+               goto close_fd;
+       }
 
-               err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id,
-                                  cfg.lpo, cfg.lsp, cfg.lsi, cfg.rae,
-                                  cfg.uuid_index, NVME_CSI_NVM,
-                                  cfg.log_len, log);
-               if (!err) {
-                       if (!cfg.raw_binary) {
-                               printf("Device:%s log-id:%d namespace-id:%#x\n",
-                                      devicename, cfg.log_id,
-                                      cfg.namespace_id);
-                               d(log, cfg.log_len, 16, 1);
-                       } else
-                               d_raw((unsigned char *)log, cfg.log_len);
-               } else if (err > 0)
-                       nvme_show_status(err);
-               else
-                       perror("log page");
-               free(log);
+       if (cfg.uuid_index > 128) {
+               perror("invalid uuid index param\n");
+               err = -EINVAL;
+               goto close_fd;
        }
+
+       log = malloc(cfg.log_len);
+       if (!log) {
+               perror("could not alloc buffer for log\n");
+               err = -ENOMEM;
+               goto close_fd;
+       }
+
+       err = nvme_get_log(fd, cfg.log_id, cfg.namespace_id,
+                          cfg.lpo, cfg.lsp, cfg.lsi, cfg.rae,
+                          cfg.uuid_index, NVME_CSI_NVM,
+                          cfg.log_len, log);
+       if (!err) {
+               if (!cfg.raw_binary) {
+                       printf("Device:%s log-id:%d namespace-id:%#x\n",
+                               devicename, cfg.log_id,
+                               cfg.namespace_id);
+                       d(log, cfg.log_len, 16, 1);
+               } else
+                       d_raw((unsigned char *)log, cfg.log_len);
+       } else if (err > 0)
+               nvme_show_status(err);
+       else
+               perror("log page");
+       free(log);
+
 close_fd:
        close(fd);
 ret: