Skip to content

Commit

Permalink
safe_create_leading_directories(): always restore slash at end of loop
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Haggerty authored and Junio C Hamano committed Jan 6, 2014
1 parent bf10cf7 commit 9e6f885
Showing 1 changed file with 9 additions and 13 deletions.
22 changes: 9 additions & 13 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, '/');

Expand All @@ -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)
Expand Down

0 comments on commit 9e6f885

Please sign in to comment.