mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
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.
This commit is contained in:
@ -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);
|
||||
|
||||
/* in tcop/utility.c */
|
||||
|
Reference in New Issue
Block a user