diff options
| author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2012-04-08 18:28:12 +0300 |
|---|---|---|
| committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2012-04-08 19:09:12 +0300 |
| commit | 77dc2b0a43176d571aabac245e7228d834f7af95 (patch) | |
| tree | 0863c4705aebd67239d0bae9f4b1a42850ba5805 /src/backend/postmaster/postmaster.c | |
| parent | f42a4c01f4bae27a06330ab235adb6533ca4ecd9 (diff) | |
Do stack-depth checking in all postmaster children.
We used to only initialize the stack base pointer when starting up a regular
backend, not in other processes. In particular, autovacuum workers can run
arbitrary user code, and without stack-depth checking, infinite recursion
in e.g an index expression will bring down the whole cluster.
The comment about PL/Java using set_stack_base() is not yet true. As the
code stands, PL/java still modifies the stack_base_ptr variable directly.
However, it's been discussed in the PL/Java mailing list that it should be
changed to use the function, because PL/Java is currently oblivious to the
register stack used on Itanium. There's another issues with PL/Java, namely
that the stack base pointer it sets is not really the base of the stack, it
could be something close to the bottom of the stack. That's a separate issue
that might need some further changes to this code, but that's a different
story.
Backpatch to all supported releases.
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
| -rw-r--r-- | src/backend/postmaster/postmaster.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 1a6c4a29143..ead51ee164e 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -947,6 +947,11 @@ PostmasterMain(int argc, char *argv[]) set_max_safe_fds(); /* + * Set reference point for stack-depth checking. + */ + set_stack_base(); + + /* * Initialize the list of active backends. */ BackendList = DLNewList(); @@ -3945,6 +3950,11 @@ SubPostmasterMain(int argc, char *argv[]) read_backend_variables(argv[2], &port); /* + * Set reference point for stack-depth checking + */ + set_stack_base(); + + /* * Set up memory area for GSS information. Mirrors the code in ConnCreate * for the non-exec case. */ |
