X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmakepath.c;h=f0303fa8f5de78c900cb6ca6d237205d42de3d87;hb=5b60c6dfee0e445f95117a760622cd33944119d8;hp=bb6a09c12ca8f895a6cac13a039c85213a3c1fb2;hpb=a89ae060ff117b21f797a78ac9e4004164266694;p=gnulib.git diff --git a/lib/makepath.c b/lib/makepath.c index bb6a09c12..f0303fa8f 100644 --- a/lib/makepath.c +++ b/lib/makepath.c @@ -19,14 +19,7 @@ Jim Meyering . */ #ifdef HAVE_CONFIG_H -#if defined (CONFIG_BROKETS) -/* We use instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because it found this file in $srcdir). */ #include -#else -#include "config.h" -#endif #endif #ifdef __GNUC__ @@ -50,11 +43,9 @@ char *alloca (); #include #endif -#ifdef STAT_MACROS_BROKEN -#ifdef S_ISDIR +#ifdef STAT_MACROS_BROKEN #undef S_ISDIR -#endif -#endif /* STAT_MACROS_BROKEN. */ +#endif /* STAT_MACROS_BROKEN. */ #if !defined(S_ISDIR) && defined(S_IFDIR) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) @@ -86,6 +77,7 @@ typedef int uid_t; typedef int gid_t; #endif +#include "safe-stat.h" void error (); /* Ensure that the directory ARGPATH exists. @@ -121,7 +113,7 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) dirpath = (char *) alloca (strlen (argpath) + 1); strcpy (dirpath, argpath); - if (stat (dirpath, &stats)) + if (SAFE_STAT (dirpath, &stats)) { char *slash; int tmp_mode; /* Initial perms for leading dirs. */ @@ -155,7 +147,7 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) while ((slash = index (slash, '/'))) { *slash = '\0'; - if (stat (dirpath, &stats)) + if (SAFE_STAT (dirpath, &stats)) { if (mkdir (dirpath, tmp_mode)) { @@ -206,7 +198,10 @@ make_path (argpath, mode, parent_mode, owner, group, verbose_fmt_string) /* We're done making leading directories. Make the final component of the path. */ - if (mkdir (dirpath, mode)) + /* The path could end in "/." or contain "/..", so test + if we really have to create the directory. */ + + if (SAFE_STAT (dirpath, &stats) && mkdir (dirpath, mode)) { error (0, errno, "cannot make directory `%s'", dirpath); umask (oldmask);