From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH 3/5] safe_create_leading_directories(): add "slash" pointer
Date: Sun, 22 Dec 2013 08:14:09 +0100 [thread overview]
Message-ID: <1387696451-32224-4-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1387696451-32224-1-git-send-email-mhagger@alum.mit.edu>
Keep track of the position of the slash character separately, and
restore the slash character at a single place, at the end of the while
loop. This makes the next change easier to implement.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
sha1_file.c | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/sha1_file.c b/sha1_file.c
index cc9957e..dcfd35a 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -107,40 +107,40 @@ int mkdir_in_gitdir(const char *path)
int safe_create_leading_directories(char *path)
{
- char *pos = path + offset_1st_component(path);
+ char *next_component = path + offset_1st_component(path);
+ int retval = 0;
- while (pos) {
+ while (!retval && next_component) {
struct stat st;
+ char *slash = strchr(next_component, '/');
- pos = strchr(pos, '/');
- if (!pos)
- break;
- while (*++pos == '/')
- ;
- if (!*pos)
- break;
- *--pos = '\0';
+ if (!slash)
+ return 0;
+ while (*(slash + 1) == '/')
+ slash++;
+ next_component = slash + 1;
+ if (!*next_component)
+ return 0;
+
+ *slash = '\0';
if (!stat(path, &st)) {
/* path exists */
if (!S_ISDIR(st.st_mode)) {
- *pos = '/';
- return -3;
+ retval = -3;
}
} else if (mkdir(path, 0777)) {
if (errno == EEXIST &&
!stat(path, &st) && S_ISDIR(st.st_mode)) {
; /* somebody created it since we checked */
} else {
- *pos = '/';
- return -1;
+ retval = -1;
}
} else if (adjust_shared_perm(path)) {
- *pos = '/';
- return -2;
+ retval = -2;
}
- *pos++ = '/';
+ *slash = '/';
}
- return 0;
+ return retval;
}
int safe_create_leading_directories_const(const char *path)
--
1.8.5.1
next prev parent reply other threads:[~2013-12-22 7:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-22 7:14 [PATCH 0/5] Fix two mkdir/rmdir races Michael Haggerty
2013-12-22 7:14 ` [PATCH 1/5] safe_create_leading_directories(): modernize format of "if" chaining Michael Haggerty
2013-12-26 21:52 ` Jonathan Nieder
2013-12-22 7:14 ` [PATCH 2/5] safe_create_leading_directories(): reduce scope of local variable Michael Haggerty
2013-12-26 21:55 ` Jonathan Nieder
2014-01-01 12:39 ` Michael Haggerty
2013-12-22 7:14 ` Michael Haggerty [this message]
2013-12-26 22:34 ` [PATCH 3/5] safe_create_leading_directories(): add "slash" pointer Jonathan Nieder
2014-01-01 21:10 ` Michael Haggerty
2013-12-22 7:14 ` [PATCH 4/5] safe_create_leading_directories(): fix a mkdir/rmdir race Michael Haggerty
2013-12-22 22:42 ` Ramsay Jones
2013-12-26 23:02 ` Jonathan Nieder
2014-01-02 0:53 ` Michael Haggerty
2013-12-22 7:14 ` [PATCH 5/5] rename_ref(): fix a mkdir()/rmdir() race Michael Haggerty
2013-12-26 23:20 ` Jonathan Nieder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1387696451-32224-4-git-send-email-mhagger@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).