From 641d6b290b49dad364a7de5fe5af7c983482d2b7 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Mar 06 2012 20:46:14 +0000 Subject: path_utils: Handle "/" in path_concat --- diff --git a/path_utils/path_utils.c b/path_utils/path_utils.c index 360d499..25ca426 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 fbefcab..34462cf 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");