aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-09-02 14:10:15 -0700
committerJunio C Hamano <gitster@pobox.com>2008-09-03 22:35:32 -0700
commit5f0bdf50c2eb640b4321acb9b34b3cb401f5ddfb (patch)
tree43d9939712c4793f4f68edd8f851917c7d5622e7
parentde5d560c99c96e2955fb4d1d8a8fa6b469926292 (diff)
downloadgit-5f0bdf50c2eb640b4321acb9b34b3cb401f5ddfb.tar.gz
git-5f0bdf50c2eb640b4321acb9b34b3cb401f5ddfb.tar.xz
safe_create_leading_directories(): make it about "leading" directories
We used to allow callers to pass "foo/bar/" to make sure both "foo" and "foo/bar" exist and have good permissions, but this interface is too error prone. If a caller mistakenly passes a path with trailing slashes (perhaps it forgot to verify the user input) even when it wants to later mkdir "bar" itself, it will find that it cannot mkdir "bar". If such a caller does not bother to check the error for EEXIST, it may even errorneously die(). Because we have no existing callers to use that obscure feature, this patch removes it to avoid confusion. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--sha1_file.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 477d3fb4b..f85c8cec3 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -99,7 +99,11 @@ int safe_create_leading_directories(char *path)
pos = strchr(pos, '/');
if (!pos)
break;
- *pos = 0;
+ while (*++pos == '/')
+ ;
+ if (!*pos)
+ break;
+ *--pos = '\0';
if (!stat(path, &st)) {
/* path exists */
if (!S_ISDIR(st.st_mode)) {