Fix: memcpy used on potentially overlapping regions
[lttng-tools.git] / src / common / utils.c
index b0e5b63e34400c3f0e2e2df57b58fcdf0f875f32..5420490a76a40f1d66d504f46e545aaebba56f78 100644 (file)
@@ -300,7 +300,7 @@ int expand_double_slashes_dot_and_dotdot(char *path)
                 * Copy the current token which is neither a '.' nor a '..'.
                 */
                path[expanded_path_len++] = '/';
-               memcpy(&path[expanded_path_len], curr_char, curr_token_len);
+               memmove(&path[expanded_path_len], curr_char, curr_token_len);
                expanded_path_len += curr_token_len;
        }
 
@@ -379,6 +379,9 @@ char *_utils_expand_path(const char *path, bool keep_symlink)
                /* Resolve partially our path */
                absolute_path = utils_partial_realpath(absolute_path,
                                absolute_path, LTTNG_PATH_MAX);
+               if (!absolute_path) {
+                       goto error;
+               }
        }
 
        ret = expand_double_slashes_dot_and_dotdot(absolute_path);
@@ -544,6 +547,7 @@ void utils_close_pipe(int *src)
                if (ret) {
                        PERROR("close pipe");
                }
+               src[i] = -1;
        }
 }
 
@@ -739,7 +743,8 @@ int utils_stream_file_path(const char *path_name, const char *file_name,
         char count_str[MAX_INT_DEC_LEN(count) + 1] = {};
        const char *path_separator;
 
-       if (path_name && path_name[strlen(path_name) - 1] == '/') {
+       if (path_name && (path_name[0] == '\0' ||
+                       path_name[strlen(path_name) - 1] == '/')) {
                path_separator = "";
        } else {
                path_separator = "/";
This page took 0.023751 seconds and 4 git commands to generate.