在 2023/11/10 18:01, Chengwen Feng 写道:
Add verify strdup() return value logic.

Fixes: 293c53d8b23c ("eal: add telemetry callbacks")
Fixes: 0d0f478d0483 ("eal/linux: add uevent parse and process")
Cc: sta...@dpdk.org

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
---
  lib/eal/common/eal_common_options.c | 24 ++++++++++++++++++++++--
  lib/eal/linux/eal_dev.c             |  3 +++
  2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/lib/eal/common/eal_common_options.c 
b/lib/eal/common/eal_common_options.c
index a6d21f1cba..8b5a4632dd 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -226,6 +226,8 @@ eal_save_args(int argc, char **argv)
                if (strcmp(argv[i], "--") == 0)
                        break;
                eal_args[i] = strdup(argv[i]);
+               if (eal_args[i] == NULL)
+                       goto error;
        }
        eal_args[i++] = NULL; /* always finish with NULL */
@@ -235,13 +237,31 @@ eal_save_args(int argc, char **argv) eal_app_args = calloc(argc - i + 1, sizeof(*eal_args));
        if (eal_app_args == NULL)
-               return -1;
+               goto error;
- for (j = 0; i < argc; j++, i++)
+       for (j = 0; i < argc; j++, i++) {
                eal_app_args[j] = strdup(argv[i]);
+               if (eal_app_args[j] == NULL)
+                       goto error;
+       }
        eal_app_args[j] = NULL;
return 0;
+
+error:
+       if (eal_app_args != NULL) {
+               i = 0;
+               while (eal_app_args[i] != NULL)
+                       free(eal_app_args[i++]);
+               free(eal_app_args);
+               eal_app_args = NULL;
+       }
+       i = 0;
+       while (eal_args[i] != NULL)
+               free(eal_args[i++]);
+       free(eal_args);
+       eal_args = NULL;
+       return -1;
  }
  #endif
diff --git a/lib/eal/linux/eal_dev.c b/lib/eal/linux/eal_dev.c
index ac76f6174d..df3cd6b39a 100644
--- a/lib/eal/linux/eal_dev.c
+++ b/lib/eal/linux/eal_dev.c
@@ -181,7 +181,10 @@ dev_uev_parse(const char *buf, struct rte_dev_event 
*event, int length)
                        buf += 14;
                        i += 14;
                        strlcpy(pci_slot_name, buf, sizeof(subsystem));
+                       free(event->devname);
It seems that above free for devname is unnecessary.
                        event->devname = strdup(pci_slot_name);
+                       if (event->devname == NULL)
+                               return -1;
                }
                for (; i < length; i++) {
                        if (*buf == '\0')

Reply via email to