Fix a number of places that were making file-type tests infelicitously.
authorTom Lane <[email protected]>
Mon, 31 Mar 2008 01:32:17 +0000 (01:32 +0000)
committerTom Lane <[email protected]>
Mon, 31 Mar 2008 01:32:17 +0000 (01:32 +0000)
The places that did, eg,
(statbuf.st_mode & S_IFMT) == S_IFDIR
were correct, but there is no good reason not to use S_ISDIR() instead,
especially when that's what the other 90% of our code does.  The places
that did, eg,
(statbuf.st_mode & S_IFDIR)
were flat out *wrong* and would fail in various platform-specific ways,
eg a symlink could be mistaken for a regular file on most Unixen.

The actual impact of this is probably small, since the problem cases
seem to always involve symlinks or sockets, which are unlikely to be
found in the directories that PG code might be scanning.  But it's
clearly trouble waiting to happen, so patch all the way back anyway.
(There seem to be no occurrences of the mistake in 7.4.)

src/backend/utils/adt/dbsize.c
src/backend/utils/adt/genfile.c
src/port/copydir.c
src/port/exec.c
src/test/regress/pg_regress.c

index 643502edadb53eed860311dd4839d17d7ba5aff2..8031ed053551e8e0749a68a0b5ac807afed92e2f 100644 (file)
@@ -187,7 +187,7 @@ calculate_tablespace_size(Oid tblspcOid)
                                                 errmsg("could not stat file \"%s\": %m", pathname)));
                }
 
-               if (fst.st_mode & S_IFDIR)
+               if (S_ISDIR(fst.st_mode))
                        totalsize += db_dir_size(pathname);
 
                totalsize += fst.st_size;
index d80385a50aa3d06dd26599e7c09e459e695db13f..236696599fd69a9930f6d9a5ab48df901d8e4e45 100644 (file)
@@ -201,7 +201,7 @@ pg_stat_file(PG_FUNCTION_ARGS)
        isnull[3] = true;
        values[4] = TimestampTzGetDatum(time_t_to_timestamptz(fst.st_ctime));
 #endif
-       values[5] = BoolGetDatum(fst.st_mode & S_IFDIR);
+       values[5] = BoolGetDatum(S_ISDIR(fst.st_mode));
 
        tuple = heap_form_tuple(tupdesc, values, isnull);
 
index 023b46dda7d885b7956c737ec2fb815b9e489abb..4a6d203a4a9439481e98b72db69fb16cdaf11b2c 100644 (file)
@@ -80,13 +80,13 @@ copydir(char *fromdir, char *todir, bool recurse)
                                        (errcode_for_file_access(),
                                         errmsg("could not stat file \"%s\": %m", fromfile)));
 
-               if (fst.st_mode & S_IFDIR)
+               if (S_ISDIR(fst.st_mode))
                {
                        /* recurse to handle subdirectories */
                        if (recurse)
                                copydir(fromfile, tofile, true);
                }
-               else if (fst.st_mode & S_IFREG)
+               else if (S_ISREG(fst.st_mode))
                        copy_file(fromfile, tofile);
        }
 
index 2cc23ea947aae7f5b283621ba12ae01eec64fd49..e7858fc2773a9b54a8055b7daf1c4521ca8acd0e 100644 (file)
@@ -79,8 +79,8 @@ validate_exec(const char *path)
 #else
        char            path_exe[MAXPGPATH + sizeof(".exe") - 1];
 #endif
-       int                     is_r = 0;
-       int                     is_x = 0;
+       int                     is_r;
+       int                     is_x;
 
 #ifdef WIN32
        /* Win32 requires a .exe suffix for stat() */
@@ -102,7 +102,7 @@ validate_exec(const char *path)
        if (stat(path, &buf) < 0)
                return -1;
 
-       if ((buf.st_mode & S_IFMT) != S_IFREG)
+       if (!S_ISREG(buf.st_mode))
                return -1;
 
        /*
@@ -330,7 +330,7 @@ resolve_symlinks(char *path)
                        fname = path;
 
                if (lstat(fname, &buf) < 0 ||
-                       (buf.st_mode & S_IFMT) != S_IFLNK)
+                       !S_ISLNK(buf.st_mode))
                        break;
 
                rllen = readlink(fname, link_buf, sizeof(link_buf));
index 29dd155859d487159a9f6be52b1dcf6950813b00..ba696f0a0d61c55690381f6a2dcb7c20dee42751 100644 (file)
@@ -784,7 +784,7 @@ directory_exists(const char *dir)
 
        if (stat(dir, &st) != 0)
                return false;
-       if (st.st_mode & S_IFDIR)
+       if (S_ISDIR(st.st_mode))
                return true;
        return false;
 }