Prevent from writing beyond the allocated memory.

GCC 10 compiling output:
eal_common_trace_utils.c: In function 'eal_trace_dir_args_save':
eal_common_trace_utils.c:290:24: error: '__builtin___sprintf_chk'   \
        may write a terminating nul past the end of the destination \
        [-Werror=format-overflow=]
  290 |  sprintf(dir_path, "%s/", optarg);
      |                        ^

Fixes: 8af866df8d8c ("trace: add trace directory configuration parameter")

Signed-off-by: Phil Yang <phil.y...@arm.com>
Reviewed-by: Lijian Zhang <lijian.zh...@arm.com>
Tested-by: Lijian Zhang <lijian.zh...@arm.com>
---
v2:
use asprintf instead of sprintf.

 lib/librte_eal/common/eal_common_trace_utils.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_trace_utils.c 
b/lib/librte_eal/common/eal_common_trace_utils.c
index fce8892..2ffb8af 100644
--- a/lib/librte_eal/common/eal_common_trace_utils.c
+++ b/lib/librte_eal/common/eal_common_trace_utils.c
@@ -268,7 +268,7 @@ eal_trace_dir_args_save(char const *optarg)
 {
        struct trace *trace = trace_obj_get();
        uint32_t size = sizeof(trace->dir);
-       char *dir_path = NULL;
+       char *dir_path;
        int rc;
 
        if (optarg == NULL) {
@@ -276,18 +276,20 @@ eal_trace_dir_args_save(char const *optarg)
                return -EINVAL;
        }
 
-       if (strlen(optarg) >= size) {
+       /* the specified trace directory name cannot
+        * exceed PATH_MAX-1.
+        */
+       if (strlen(optarg) >= (size - 1)) {
                trace_err("input string is too big");
                return -ENAMETOOLONG;
        }
 
-       dir_path = (char *)calloc(1, size);
-       if (dir_path == NULL) {
-               trace_err("fail to allocate memory");
+       rc = asprintf(&dir_path, "%s/", optarg);
+       if (rc == -1) {
+               trace_err("failed to copy directory: %s", strerror(errno));
                return -ENOMEM;
        }
 
-       sprintf(dir_path, "%s/", optarg);
        rc = trace_dir_update(dir_path);
 
        free(dir_path);
-- 
2.7.4

Reply via email to