aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-01-06 02:58:40 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-01-06 02:58:40 +0000
commit5d0def8d5273da8972b673ff76ddbe025b693e7b (patch)
treed0382fb0999af5042fb61daa40ed626983439665
parent240112222cff3c72df900dafaf4be9eefd3bd063 (diff)
downloadpostgresql-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.c17
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);