path-util: fix path_simplify() with kill_dots and "."
authorThomas Haller <thaller@redhat.com>
Fri, 5 Oct 2018 11:14:38 +0000 (13:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 5 Oct 2018 19:41:33 +0000 (21:41 +0200)
Previously, together with kill_dots true, patch like
".", "./.", ".//.//" would all return an empty string.

That is wrong. There must be one "." left to reference
the current directory.

Also, the comment with examples was wrong.

src/basic/path-util.c
src/test/test-path-util.c

index f3c6c16..f60cf00 100644 (file)
@@ -333,12 +333,15 @@ char *path_simplify(char *path, bool kill_dots) {
         /* Removes redundant inner and trailing slashes. Also removes unnecessary dots
          * if kill_dots is true. Modifies the passed string in-place.
          *
-         * ///foo//./bar/.   becomes /foo/./bar/.  (if kill_dots is false)
-         * ///foo//./bar/.   becomes /foo/bar      (if kill_dots is true)
-         * .//./foo//./bar/. becomes ./foo/bar     (if kill_dots is false)
-         * .//./foo//./bar/. becomes foo/bar       (if kill_dots is true)
+         * ///foo//./bar/.   becomes /foo/./bar/.      (if kill_dots is false)
+         * ///foo//./bar/.   becomes /foo/bar          (if kill_dots is true)
+         * .//./foo//./bar/. becomes ././foo/./bar/.   (if kill_dots is false)
+         * .//./foo//./bar/. becomes foo/bar           (if kill_dots is true)
          */
 
+        if (isempty(path))
+                return path;
+
         absolute = path_is_absolute(path);
 
         f = path;
@@ -368,9 +371,14 @@ char *path_simplify(char *path, bool kill_dots) {
                 *(t++) = *f;
         }
 
-        /* Special rule, if we are talking of the root directory, a trailing slash is good */
-        if (absolute && t == path)
-                *(t++) = '/';
+        /* Special rule, if we stripped everything, we either need a "/" (for the root directory)
+         * or "." for the current directory */
+        if (t == path) {
+                if (absolute)
+                        *(t++) = '/';
+                else
+                        *(t++) = '.';
+        }
 
         *t = 0;
         return path;
index 9ec42aa..8b9686d 100644 (file)
@@ -81,10 +81,10 @@ static void test_path(void) {
         test_path_simplify("///.//", "/.", "/");
         test_path_simplify("///.//.///", "/./.", "/");
         test_path_simplify("////.././///../.", "/.././../.", "/../..");
-        test_path_simplify(".", ".", "");
-        test_path_simplify("./", ".", "");
-        test_path_simplify(".///.//./.", "./././.", "");
-        test_path_simplify(".///.//././/", "./././.", "");
+        test_path_simplify(".", ".", ".");
+        test_path_simplify("./", ".", ".");
+        test_path_simplify(".///.//./.", "./././.", ".");
+        test_path_simplify(".///.//././/", "./././.", ".");
         test_path_simplify("//./aaa///.//./.bbb/..///c.//d.dd///..eeee/.",
                            "/./aaa/././.bbb/../c./d.dd/..eeee/.",
                            "/aaa/.bbb/../c./d.dd/..eeee");