diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-06 02:58:40 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-01-06 02:58:40 +0000 |
commit | 5d0def8d5273da8972b673ff76ddbe025b693e7b (patch) | |
tree | d0382fb0999af5042fb61daa40ed626983439665 | |
parent | 240112222cff3c72df900dafaf4be9eefd3bd063 (diff) | |
download | postgresql-5d0def8d5273da8972b673ff76ddbe025b693e7b.tar.gz postgresql-5d0def8d5273da8972b673ff76ddbe025b693e7b.zip |
Fix Windows-only postmaster code to reject a connection request and continue,
rather than elog(FATAL), when there is no more room in ShmemBackendArray.
This is a security issue since too many connection requests arriving close
together could cause the postmaster to shut down, resulting in denial of
service. Reported by Yoshiyuki Asaba, fixed by Magnus Hagander.
-rw-r--r-- | src/backend/postmaster/postmaster.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 8b316197fc1..bc7e543242d 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.443.4.4 2005/11/05 03:05:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.443.4.5 2006/01/06 02:58:40 tgl Exp $ * * NOTES * @@ -144,7 +144,11 @@ typedef struct bkend static Dllist *BackendList; #ifdef EXEC_BACKEND -#define NUM_BACKENDARRAY_ELEMS (2*MaxBackends) +/* + * Number of entries in the backend table. Twice the number of backends, + * plus four other subprocesses (stats, bgwriter, autovac, logger). + */ +#define NUM_BACKENDARRAY_ELEMS (2*MaxBackends + 4) static Backend *ShmemBackendArray; #endif @@ -3018,6 +3022,15 @@ internal_forkexec(int argc, char *argv[], Port *port) Assert(strncmp(argv[1], "-fork", 5) == 0); Assert(argv[2] == NULL); + /* Verify that there is room in the child list */ + if (win32_numChildren >= NUM_BACKENDARRAY_ELEMS) + { + elog(LOG, "no room for child entry in backend list"); + /* Report same error as for a fork failure on Unix */ + errno = EAGAIN; + return -1; + } + /* Set up shared memory for parameter passing */ ZeroMemory(&sa,sizeof(sa)); sa.nLength = sizeof(sa); |