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:26 +0300 |
| commit | 89da5dc6db7e649396eb1cfa1abcdd39f86cdd88 (patch) | |
| tree | 692d53195b6b6f0b3d9d275c97d51f85d608cb4d /src/include | |
| parent | 34684cee64652ed1bc66f02f41c47196bfce1441 (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/include')
| -rw-r--r-- | src/include/miscadmin.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 87d01305b3c..e195b963080 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -234,6 +234,19 @@ extern bool VacuumCostActive; /* in tcop/postgres.c */ + +#if defined(__ia64__) || defined(__ia64) +typedef struct +{ + char *stack_base_ptr; + char *register_stack_base_ptr; +} pg_stack_base_t; +#else +typedef char *pg_stack_base_t; +#endif + +extern pg_stack_base_t set_stack_base(void); +extern void restore_stack_base(pg_stack_base_t base); extern void check_stack_depth(void); |
