From: Joel Rosdahl Date: Sat, 15 Nov 2014 15:17:15 +0000 (+0100) Subject: Fix bug in dirname X-Git-Tag: v3.2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=136d76854c93a36491a0906e835490ad6927cf47;p=thirdparty%2Fccache.git Fix bug in dirname This avoids a crash when running "ccache -s" with CCACHE_DIR="". --- diff --git a/test/test_util.c b/test/test_util.c index c499b49d8..a9c54793b 100644 --- a/test/test_util.c +++ b/test/test_util.c @@ -38,6 +38,7 @@ TEST(dirname) CHECK_STR_EQ_FREE2(".", dirname("foo.c")); CHECK_STR_EQ_FREE2(".", dirname("")); CHECK_STR_EQ_FREE2("/", dirname("/")); + CHECK_STR_EQ_FREE2("/", dirname("/foo.c")); CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/foo.c")); CHECK_STR_EQ_FREE2("/dir", dirname("/dir/foo.c")); CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/")); diff --git a/util.c b/util.c index 072f53b9b..30c14cc96 100644 --- a/util.c +++ b/util.c @@ -780,24 +780,27 @@ char * dirname(const char *path) { char *p; - char *p2 = NULL; +#ifdef _WIN32 + char *p2; +#endif char *s; s = x_strdup(path); p = strrchr(s, '/'); #ifdef _WIN32 p2 = strrchr(s, '\\'); -#endif - if (p < p2) + if (!p || (p2 && p < p2)) { p = p2; - if (p == s) { - return s; - } else if (p) { - *p = 0; - return s; - } else { + } +#endif + if (!p) { free(s); - return x_strdup("."); + s = x_strdup("."); + } else if (p == s) { + *(p + 1) = 0; + } else { + *p = 0; } + return s; } /*