Fix a number of places that were making file-type tests infelicitously.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Mar 2008 01:32:01 +0000 (01:32 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Mar 2008 01:32:01 +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 5168e13ade93b2d651e5ff5ca90964360a2819af..2e655edbb5a2c38ed2c50b70c48811952146e4d3 100644 (file)
@@ -209,7 +209,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 475b7cff05acba0b59bffba5e8ea6c7b721f3fc4..98c55ceb743354bd79b5bef74706c431bed35b93 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 73b227bf575b06055ff08a9ef3bfd7fef91dfdf6..8d8c24f5bf52e803fd43926756289864d6448e1f 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 fd8a2fba987b607a9d8cec21190b7f5f61faa865..3210686dcb2bad0cd5ac35f73b5c002a9ba15856 100644 (file)
@@ -80,8 +80,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() */
@@ -103,7 +103,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;
 
        /*
@@ -331,7 +331,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 3af8b26bc055b2831dda812868b5e60b14d1da76..8c2cf7e4d9f4e587722199becfc31964c4d35637 100644 (file)
@@ -1102,7 +1102,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;
 }