From 98e34f92cb576f8096793659805327afe5ceaef3 Mon Sep 17 00:00:00 2001 From: zarzycki Date: Tue, 5 Feb 2002 21:55:12 +0000 Subject: Fix the race between the stat() and the mkdir(). Reviewed by: jkh --- bin/mkdir/mkdir.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'bin/mkdir/mkdir.c') diff --git a/bin/mkdir/mkdir.c b/bin/mkdir/mkdir.c index 417f7a3..bc06ff9 100644 --- a/bin/mkdir/mkdir.c +++ b/bin/mkdir/mkdir.c @@ -173,25 +173,28 @@ build(char *path, mode_t omode) } if (last) (void)umask(oumask); - if (stat(path, &sb)) { - if (errno != ENOENT || - mkdir(path, last ? omode : - S_IRWXU | S_IRWXG | S_IRWXO) < 0) { + if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { + if (errno == EEXIST) { + if (stat(path, &sb) < 0) { + warn("%s", path); + retval = 1; + break; + } else if (!S_ISDIR(sb.st_mode)) { + if (last) + errno = EEXIST; + else + errno = ENOTDIR; + warn("%s", path); + retval = 1; + break; + } + } else { warn("%s", path); retval = 1; break; - } else if (vflag) - printf("%s\n", path); - } - else if ((sb.st_mode & S_IFMT) != S_IFDIR) { - if (last) - errno = EEXIST; - else - errno = ENOTDIR; - warn("%s", path); - retval = 1; - break; - } + } + } else if (vflag) + printf("%s\n", path); if (!last) *p = '/'; } -- cgit v1.1