From: Tom Lane Date: Wed, 8 Aug 2001 22:25:45 +0000 (+0000) Subject: Back-patch fix to prevent infinite loop when $PGDATA is not writable. X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=7cbfe89c80bf39c95817755a1aa32b719b76ea74;p=users%2Fbernd%2Fpostgres.git Back-patch fix to prevent infinite loop when $PGDATA is not writable. --- diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index b41cec2c7f..c8185958a0 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -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); /*