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:48 +0000 (01:32 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Mar 2008 01:32:48 +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

index 757b97dc33490a3e324d372a51a3d6c5ef6ccbab..47133f948d0d00a4d9be4ec71295990dfbc89abe 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright (c) 2002-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.7.2.1 2007/03/11 06:43:23 alvherre Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.7.2.2 2008/03/31 01:32:48 tgl Exp $
  *
  */
 
@@ -186,7 +186,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 e51be2b22973eefebc43f529515bbf6f3cc28ccb..e7c9c483f7a66b44f50507ec46792b5e9df909e2 100644 (file)
@@ -9,7 +9,7 @@
  * Author: Andreas Pflug <pgadmin@pse-consulting.de>
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/genfile.c,v 1.9 2005/10/29 00:31:51 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/genfile.c,v 1.9.2.1 2008/03/31 01:32:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -205,7 +205,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 8fcfa1acdefcd383e59fed4739276dfa43fd5610..d98b71933d34ee47321b4cd8a8b073cde0279025 100644 (file)
@@ -11,7 +11,7 @@
  *     as a service.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/port/copydir.c,v 1.16 2005/10/29 00:31:52 petere Exp $
+ *       $PostgreSQL: pgsql/src/port/copydir.c,v 1.16.2.1 2008/03/31 01:32:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 5f0f6959f5448cb3f9bfbb3e296bbac6686fe69a..1fa2d5d8fece0196b147daa8bc2ef68898ab53ec 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/port/exec.c,v 1.39.2.1 2005/11/22 18:23:31 momjian Exp $
+ *       $PostgreSQL: pgsql/src/port/exec.c,v 1.39.2.2 2008/03/31 01:32:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -78,8 +78,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() */
@@ -101,7 +101,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;
 
        /*
@@ -329,7 +329,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));