safe_create_leading_directories(): always restore slash at end of loop
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>
This commit is contained in:
parent
bf10cf70ad
commit
9e6f885d14
22
sha1_file.c
22
sha1_file.c
@ -108,8 +108,9 @@ int mkdir_in_gitdir(const char *path)
|
|||||||
int safe_create_leading_directories(char *path)
|
int safe_create_leading_directories(char *path)
|
||||||
{
|
{
|
||||||
char *next_component = path + offset_1st_component(path);
|
char *next_component = path + offset_1st_component(path);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
while (next_component) {
|
while (!ret && next_component) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *slash = strchr(next_component, '/');
|
char *slash = strchr(next_component, '/');
|
||||||
|
|
||||||
@ -125,25 +126,20 @@ int safe_create_leading_directories(char *path)
|
|||||||
*slash = '\0';
|
*slash = '\0';
|
||||||
if (!stat(path, &st)) {
|
if (!stat(path, &st)) {
|
||||||
/* path exists */
|
/* path exists */
|
||||||
if (!S_ISDIR(st.st_mode)) {
|
if (!S_ISDIR(st.st_mode))
|
||||||
*slash = '/';
|
ret = -3;
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
} else if (mkdir(path, 0777)) {
|
} else if (mkdir(path, 0777)) {
|
||||||
if (errno == EEXIST &&
|
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 */
|
; /* somebody created it since we checked */
|
||||||
} else {
|
else
|
||||||
*slash = '/';
|
ret = -1;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (adjust_shared_perm(path)) {
|
} else if (adjust_shared_perm(path)) {
|
||||||
*slash = '/';
|
ret = -2;
|
||||||
return -2;
|
|
||||||
}
|
}
|
||||||
*slash = '/';
|
*slash = '/';
|
||||||
}
|
}
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int safe_create_leading_directories_const(const char *path)
|
int safe_create_leading_directories_const(const char *path)
|
||||||
|
Loading…
Reference in New Issue
Block a user