]> granicus.if.org Git - postgresql/commitdiff
Don't pass an invalid file handle to dup2(). That causes a crash on
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 1 Apr 2010 20:12:34 +0000 (20:12 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 1 Apr 2010 20:12:34 +0000 (20:12 +0000)
Windows, thanks to a feature in CRT called Parameter Validation.

Backpatch to 8.2, which is the oldest version supported on Windows. In
8.2 and 8.3 also backpatch the earlier change to use DEVNULL instead of
NULL_DEV #define for a /dev/null-like device. NULL_DEV was hard-coded to
"/dev/null" regardless of platform, which didn't work on Windows, while
DEVNULL works on all platforms. Restarting syslogger didn't work on
Windows on versions 8.3 and below because of that.

src/backend/postmaster/postmaster.c
src/backend/postmaster/syslogger.c
src/include/c.h

index 636b12f737fcfaf2d4b62948675884faeab14835..5e705a36b4f3f1ad2e03584b0eae8bd1ef8f9c21 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.551.2.5 2009/12/02 17:41:31 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.551.2.6 2010/04/01 20:12:34 heikki Exp $
  *
  * NOTES
  *
@@ -1174,7 +1174,7 @@ pmdaemonize(void)
                ExitPostmaster(1);
        }
 #endif
-       i = open(NULL_DEV, O_RDWR, 0);
+       i = open(DEVNULL, O_RDWR, 0);
        dup2(i, 0);
        dup2(i, 1);
        dup2(i, 2);
index 198ca26324705f92e2c8ee35001aac7325c5972a..3b1ad0b0f3c17c6db9d3ecfc3554005e4e9d6ab7 100644 (file)
@@ -18,7 +18,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.44.2.2 2009/11/19 02:45:50 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.44.2.3 2010/04/01 20:12:34 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -184,7 +184,7 @@ SysLoggerMain(int argc, char *argv[])
         */
        if (redirection_done)
        {
-               int                     fd = open(NULL_DEV, O_WRONLY, 0);
+               int                     fd = open(DEVNULL, O_WRONLY, 0);
 
                /*
                 * The closes might look redundant, but they are not: we want to be
@@ -194,9 +194,12 @@ SysLoggerMain(int argc, char *argv[])
                 */
                close(fileno(stdout));
                close(fileno(stderr));
-               dup2(fd, fileno(stdout));
-               dup2(fd, fileno(stderr));
-               close(fd);
+               if (fd != -1)
+               {
+                       dup2(fd, fileno(stdout));
+                       dup2(fd, fileno(stderr));
+                       close(fd);
+               }
        }
 
        /*
index 5803a28bf307350ccd6a67b12838b66b75bf9ce2..aca767ce8a9bba8e2b8e98758cb0e4df49cce269 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/c.h,v 1.222.2.2 2009/03/11 00:08:07 alvherre Exp $
+ * $PostgreSQL: pgsql/src/include/c.h,v 1.222.2.3 2010/04/01 20:12:34 heikki Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -762,7 +762,11 @@ typedef NameData *Name;
 #include <unistd.h>
 #endif
 
-/* These are for things that are one way on Unix and another on NT */
+/*
+ * This only works on Unix, not on Windows! This isn't used in PostgreSQL
+ * anymore, use the platform-aware DEVNULL instead. This is kept here just
+ * in case a 3rd party module uses it.
+ */
 #define NULL_DEV               "/dev/null"
 
 /*