Back-patch fix to prevent infinite loop when $PGDATA is not writable.
authorTom Lane <[email protected]>
Wed, 8 Aug 2001 22:25:45 +0000 (22:25 +0000)
committerTom Lane <[email protected]>
Wed, 8 Aug 2001 22:25:45 +0000 (22:25 +0000)
src/backend/utils/init/miscinit.c

index b41cec2c7f2dda69d0c45981c2e801ea565209d2..c8185958a008e8de6e3242d96ec69c9d37c1c6c0 100644 (file)
@@ -490,15 +490,18 @@ CreateLockFile(const char *filename, bool amPostmaster,
 {
        int                     fd;
        char            buffer[MAXPGPATH + 100];
+       int                     ntries;
        int                     len;
        int                     encoded_pid;
        pid_t           other_pid;
        pid_t           my_pid = getpid();
 
        /*
-        * We need a loop here because of race conditions.
+        * We need a loop here because of race conditions.  But don't loop
+        * forever (for example, a non-writable $PGDATA directory might cause
+        * a failure that won't go away).  100 tries seems like plenty.
         */
-       for (;;)
+       for (ntries = 0; ; ntries++)
        {
 
                /*
@@ -511,7 +514,7 @@ CreateLockFile(const char *filename, bool amPostmaster,
                /*
                 * Couldn't create the pid file. Probably it already exists.
                 */
-               if (errno != EEXIST && errno != EACCES)
+               if ((errno != EEXIST && errno != EACCES) || ntries > 100)
                        elog(FATAL, "Can't create lock file %s: %m", filename);
 
                /*