safe_create_leading_directories(): always restore slash at end of loop
authorMichael Haggerty <mhagger@alum.mit.edu>
Mon, 6 Jan 2014 13:45:24 +0000 (14:45 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Jan 2014 17:34:21 +0000 (09:34 -0800)
Always restore the slash that we scribbled over at the end of the
loop, rather than also fixing it up at each premature exit from the
loop. This makes it harder to forget to do the cleanup as new paths
are added to the code.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c
index 1d9cc1b66f74bbaebc97c6be01fda499fc596654..60d6fce07410fcfd550ab50c83b7fc370f825dd8 100644 (file)
@@ -108,8 +108,9 @@ int mkdir_in_gitdir(const char *path)
 int safe_create_leading_directories(char *path)
 {
        char *next_component = path + offset_1st_component(path);
+       int ret = 0;
 
-       while (next_component) {
+       while (!ret && next_component) {
                struct stat st;
                char *slash = strchr(next_component, '/');
 
@@ -125,25 +126,20 @@ int safe_create_leading_directories(char *path)
                *slash = '\0';
                if (!stat(path, &st)) {
                        /* path exists */
-                       if (!S_ISDIR(st.st_mode)) {
-                               *slash = '/';
-                               return -3;
-                       }
+                       if (!S_ISDIR(st.st_mode))
+                               ret = -3;
                } else if (mkdir(path, 0777)) {
                        if (errno == EEXIST &&
-                           !stat(path, &st) && S_ISDIR(st.st_mode)) {
+                           !stat(path, &st) && S_ISDIR(st.st_mode))
                                ; /* somebody created it since we checked */
-                       } else {
-                               *slash = '/';
-                               return -1;
-                       }
+                       else
+                               ret = -1;
                } else if (adjust_shared_perm(path)) {
-                       *slash = '/';
-                       return -2;
+                       ret = -2;
                }
                *slash = '/';
        }
-       return 0;
+       return ret;
 }
 
 int safe_create_leading_directories_const(const char *path)