summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanu Kaskinen <tanu.kaskinen@linux.intel.com>2014-05-24 12:01:12 +0300
committerLennart Poettering <lennart@poettering.net>2014-05-25 11:21:19 +0800
commit5216f599ff677a18016bfa1995d1f1e6a50e4a0b (patch)
treeb189cc19b72aac514a380ee8b48f867e98bfbd38
parent590b6b9188e75ba46c42995984a1c2fa06adb6d6 (diff)
path-util: fix missing terminating zero
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.
-rw-r--r--src/shared/path-util.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/shared/path-util.c b/src/shared/path-util.c
index 2f38c1096b..5863429c31 100644
--- a/src/shared/path-util.c
+++ b/src/shared/path-util.c
@@ -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;