summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2014-01-06 14:45:24 +0100
committerJunio C Hamano <gitster@pobox.com>2014-01-06 09:34:21 -0800
commit9e6f885d146c58b23b166a99b93f115735b7bf22 (patch)
tree6729b22e662002f20feba981ee4efae6b91b6104
parentbf10cf70ad0c777dbbbb00bbb741436e285c2181 (diff)
downloadgit-9e6f885d146c58b23b166a99b93f115735b7bf22.tar.gz
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>
-rw-r--r--sha1_file.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 1d9cc1b66f..60d6fce074 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -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)