chiark / gitweb /
path-util: fix missing terminating zero
authorTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Sat, 24 May 2014 09:01:12 +0000 (12:01 +0300)
committerLennart Poettering <lennart@poettering.net>
Sun, 25 May 2014 03:21:19 +0000 (11:21 +0800)
There was this code:

        if (to_path_len > 0)
                memcpy(p, to_path, to_path_len);

That didn't add the terminating zero, so the resulting string was
corrupt if this code path was taken.

Using strcpy() instead of memcpy() solves this issue, and also
simplifies the code.

Previously there was special handling for shortening "../../" to
"../..", but that has now been replaced by a path_kill_slashes() call,
which also makes the result prettier in case the input contains
redundant slashes that would otherwise be copied to the result.

src/shared/path-util.c

index 2f38c1096b642d1b15cb741016401221066951be..5863429c311d483f81a88a8076bbb295ae25e8e9 100644 (file)
@@ -135,7 +135,6 @@ char *path_make_absolute_cwd(const char *p) {
 int path_make_relative(const char *from_dir, const char *to_path, char **_r) {
         char *r, *p;
         unsigned n_parents;
-        size_t to_path_len;
 
         assert(from_dir);
         assert(to_path);
@@ -168,6 +167,8 @@ int path_make_relative(const char *from_dir, const char *to_path, char **_r) {
                         if (!r)
                                 return -ENOMEM;
 
+                        path_kill_slashes(r);
+
                         *_r = r;
                         return 0;
                 }
@@ -202,21 +203,15 @@ int path_make_relative(const char *from_dir, const char *to_path, char **_r) {
                 n_parents++;
         }
 
-        to_path_len = strlen(to_path);
-
-        r = malloc(n_parents * 3 + to_path_len);
+        r = malloc(n_parents * 3 + strlen(to_path) + 1);
         if (!r)
                 return -ENOMEM;
 
         for (p = r; n_parents > 0; n_parents--, p += 3)
                 memcpy(p, "../", 3);
 
-        if (to_path_len > 0)
-                memcpy(p, to_path, to_path_len);
-        else
-                /* "to_path" is a parent directory of "from_dir". Let's remove
-                 * the redundant slash from the end of the result. */
-                *(p - 1) = 0;
+        strcpy(p, to_path);
+        path_kill_slashes(r);
 
         *_r = r;
         return 0;