safe_create_leading_directories(): split on first of multiple slashes
authorMichael Haggerty <mhagger@alum.mit.edu>
Mon, 6 Jan 2014 13:45:23 +0000 (14:45 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Jan 2014 17:34:20 +0000 (09:34 -0800)
If the input path has multiple slashes between path components (e.g.,
"foo//bar"), then the old code was breaking the path at the last
slash, not the first one. So in the above example, the second slash
was overwritten with NUL, resulting in the parent directory being
sought as "foo/".

When stat() is called on "foo/", it fails with ENOTDIR if "foo" exists
but is not a directory. This caused the wrong path to be taken in the
subsequent logic.

So instead, split path components at the first intercomponent slash
rather than the last one.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c
index 4dd16c38f6bfa3969796845db6c41ba10b63f7b8..1d9cc1b66f74bbaebc97c6be01fda499fc596654 100644 (file)
@@ -115,9 +115,10 @@ int safe_create_leading_directories(char *path)
 
                if (!slash)
                        break;
-               while (*(slash + 1) == '/')
-                       slash++;
+
                next_component = slash + 1;
+               while (*next_component == '/')
+                       next_component++;
                if (!*next_component)
                        break;