summaryrefslogtreecommitdiff
path: root/src/include/miscadmin.h
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2012-04-08 18:28:12 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2012-04-08 19:09:12 +0300
commit77dc2b0a43176d571aabac245e7228d834f7af95 (patch)
tree0863c4705aebd67239d0bae9f4b1a42850ba5805 /src/include/miscadmin.h
parentf42a4c01f4bae27a06330ab235adb6533ca4ecd9 (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/miscadmin.h')
-rw-r--r--src/include/miscadmin.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index a65bcda5044..8a0629464c9 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);
/* in tcop/utility.c */