From ef29bb1f7254222835267cc03389ed12602c677c Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sun, 8 Apr 2012 18:28:12 +0300 Subject: 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. --- src/include/miscadmin.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/include/miscadmin.h') diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 9d194171a56..29363ead1a0 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -235,6 +235,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); /* in tcop/utility.c */ -- cgit v1.2.3