lib/fs: Fix and simplify make_path()

Calling stat() before mkdir() is racey: The entry might change in
between. Also, the call to stat() seems to exist only to check if the
directory exists already. So simply call mkdir() unconditionally and
catch only errors other than EEXIST.

Signed-off-by: Phil Sutter <phil@nwl.cc>
This commit is contained in:
Phil Sutter 2017-08-24 11:41:30 +02:00 committed by Stephen Hemminger
parent b5c78e1b2c
commit ac3415f5c1

View File

@ -102,7 +102,6 @@ out:
int make_path(const char *path, mode_t mode)
{
char *dir, *delim;
struct stat sbuf;
int rc = -1;
delim = dir = strdup(path);
@ -120,20 +119,11 @@ int make_path(const char *path, mode_t mode)
if (delim)
*delim = '\0';
if (stat(dir, &sbuf) != 0) {
if (errno != ENOENT) {
fprintf(stderr,
"stat failed for %s: %s\n",
dir, strerror(errno));
goto out;
}
if (mkdir(dir, mode) != 0) {
fprintf(stderr,
"mkdir failed for %s: %s\n",
dir, strerror(errno));
goto out;
}
rc = mkdir(dir, mode);
if (mkdir(dir, mode) != 0 && errno != EEXIST) {
fprintf(stderr, "mkdir failed for %s: %s\n",
dir, strerror(errno));
goto out;
}
if (delim == NULL)