63 lines
2.6 KiB
Diff
63 lines
2.6 KiB
Diff
|
From 641d6b290b49dad364a7de5fe5af7c983482d2b7 Mon Sep 17 00:00:00 2001
|
||
|
From: Stephen Gallagher <sgallagh@redhat.com>
|
||
|
Date: Tue, 6 Mar 2012 11:34:41 -0500
|
||
|
Subject: [PATCH 2/2] path_utils: Handle "/" in path_concat
|
||
|
|
||
|
---
|
||
|
path_utils/path_utils.c | 12 ++++++++++--
|
||
|
path_utils/path_utils_ut.c | 9 +++++++++
|
||
|
2 files changed, 19 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/path_utils/path_utils.c b/path_utils/path_utils.c
|
||
|
index 360d49943436681970691cc829c8039f3a0e8a5f..25ca4267fc0d7d9f3483646c2aef22fcdef1eb24 100644
|
||
|
--- a/path_utils/path_utils.c
|
||
|
+++ b/path_utils/path_utils.c
|
||
|
@@ -202,14 +202,22 @@ int path_concat(char *path, size_t path_size, const char *head, const char *tail
|
||
|
|
||
|
if (head && *head) {
|
||
|
for (p = head; *p; p++); /* walk to end of head */
|
||
|
- for (p--; p >= head && *p == '/'; p--); /* skip any trailing slashes in head */
|
||
|
+ for (p--; p > head && *p == '/'; p--); /* skip any trailing slashes in head */
|
||
|
if ((p - head) > path_size-1) return ENOBUFS;
|
||
|
for (src = head; src <= p && dst < dst_end;) *dst++ = *src++; /* copy head */
|
||
|
}
|
||
|
if (tail && *tail) {
|
||
|
for (p = tail; *p && *p == '/'; p++); /* skip any leading slashes in tail */
|
||
|
if (dst > path)
|
||
|
- if (dst < dst_end) *dst++ = '/'; /* insert single slash between head & tail */
|
||
|
+ /* insert single slash between head & tail
|
||
|
+ * Making sure not to add an extra if the
|
||
|
+ * preceding character is also a slash
|
||
|
+ * (such as the case where head was the
|
||
|
+ * special-case "/".
|
||
|
+ */
|
||
|
+ if (dst < dst_end && *(dst-1) != '/') {
|
||
|
+ *dst++ = '/';
|
||
|
+ }
|
||
|
for (src = p; *src && dst < dst_end;) *dst++ = *src++; /* copy tail */
|
||
|
if (*src) return ENOBUFS; /* failed to copy everything */
|
||
|
}
|
||
|
diff --git a/path_utils/path_utils_ut.c b/path_utils/path_utils_ut.c
|
||
|
index fbefcab1eb66b5c36a3d7a74a099f569ea764b3b..34462cfdd4a2238f878a170fba2481b31f96e33e 100644
|
||
|
--- a/path_utils/path_utils_ut.c
|
||
|
+++ b/path_utils/path_utils_ut.c
|
||
|
@@ -229,6 +229,15 @@ START_TEST(test_path_concat)
|
||
|
fail_unless(path_concat(p, PATH_MAX, "", "foo") == SUCCESS);
|
||
|
fail_unless_str_equal(p, "foo");
|
||
|
|
||
|
+ fail_unless(path_concat(p, PATH_MAX, "/", "foo") == SUCCESS);
|
||
|
+ fail_unless_str_equal(p, "/foo");
|
||
|
+
|
||
|
+ fail_unless(path_concat(p, PATH_MAX, "/foo", "/") == SUCCESS);
|
||
|
+ fail_unless_str_equal(p, "/foo/");
|
||
|
+
|
||
|
+ fail_unless(path_concat(p, PATH_MAX, "/foo", "bar/") == SUCCESS);
|
||
|
+ fail_unless_str_equal(p, "/foo/bar/");
|
||
|
+
|
||
|
fail_unless(path_concat(p, PATH_MAX, NULL, "foo") == SUCCESS);
|
||
|
fail_unless_str_equal(p, "foo");
|
||
|
|
||
|
--
|
||
|
1.7.7.6
|
||
|
|