[PATCH] safe_create_leading_directories: fix race that could give a false negative
- From
Steven Walter <stevenrwalter@gmail.com>
- Date
- Mar 17, 2013, 14:09 UTC
- Message-ID
- <1363529367-5919-1-git-send-email-stevenrwalter@gmail.com>
- In-Reply-To
- <7v7gl6sfsg.fsf@alter.siamese.dyndns.org>
If two processes are racing to create the same directory tree, they will both see that the directory doesn't exist, both try to mkdir(), and one of them will fail. This is okay, as we only care that the directory gets created. So, we add a check for EEXIST from mkdir, and continue if the directory now exists.
Signed-off-by: Steven Walter <stevenrwalter@gmail.com> --- sha1_file.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/sha1_file.c b/sha1_file.c index 40b2329..5668ecc 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -123,6 +123,15 @@ int safe_create_leading_directories(char *path) } } else if (mkdir(path, 0777)) { + if (errno == EEXIST) { + /* + * We could be racing with another process to + * create the directory. As long as the + * directory gets created, we don't care. + */ + if (stat(path, &st) && S_ISDIR(st.st_mode)) + continue; + } *pos = '/'; return -1; }
-- 1.7.10.4