]> granicus.if.org Git - postgresql/commitdiff
Make get_stack_depth_rlimit() handle RLIM_INFINITY more sanely.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 6 Nov 2010 20:50:18 +0000 (16:50 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 6 Nov 2010 20:50:18 +0000 (16:50 -0400)
Rather than considering this result as meaning "unknown", report LONG_MAX.
This won't change what superusers can set max_stack_depth to, but it will
cause InitializeGUCOptions() to set the built-in default to 2MB not 100kB.
The latter seems like a fairly unreasonable interpretation of "infinity".
Per my investigation of odd buildfarm results as well as an old complaint
from Heikki.

Since this should persuade all the buildfarm animals to use a reasonable
stack depth setting during "make check", revert previous patch that dumbed
down a recursive regression test to only 5 levels.

src/backend/tcop/postgres.c
src/backend/utils/misc/guc.c
src/test/regress/expected/plpgsql.out
src/test/regress/sql/plpgsql.sql

index edf18fd0f20b6500fbb0136aa046e98524157e63..60f3c7c63d08432687db9231cf4e229c3d1d604e 100644 (file)
 
 #include "postgres.h"
 
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
 #include <time.h>
 #include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
 #include <sys/socket.h>
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
@@ -4107,7 +4108,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 /*
  * Obtain platform stack depth limit (in bytes)
  *
- * Return -1 if unlimited or not known
+ * Return -1 if unknown
  */
 long
 get_stack_depth_rlimit(void)
@@ -4123,7 +4124,10 @@ get_stack_depth_rlimit(void)
                if (getrlimit(RLIMIT_STACK, &rlim) < 0)
                        val = -1;
                else if (rlim.rlim_cur == RLIM_INFINITY)
-                       val = -1;
+                       val = LONG_MAX;
+               /* rlim_cur is probably of an unsigned type, so check for overflow */
+               else if (rlim.rlim_cur >= LONG_MAX)
+                       val = LONG_MAX;
                else
                        val = rlim.rlim_cur;
        }
index b5dfa2287bb359755e47f021d9e57724a076a426..09beb5f39850ac4104b644f81769800bd355b4c3 100644 (file)
@@ -3485,14 +3485,14 @@ InitializeGUCOptions(void)
        stack_rlimit = get_stack_depth_rlimit();
        if (stack_rlimit > 0)
        {
-               int                     new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L;
+               long            new_limit = (stack_rlimit - STACK_DEPTH_SLOP) / 1024L;
 
                if (new_limit > 100)
                {
                        char            limbuf[16];
 
                        new_limit = Min(new_limit, 2048);
-                       sprintf(limbuf, "%d", new_limit);
+                       sprintf(limbuf, "%ld", new_limit);
                        SetConfigOption("max_stack_depth", limbuf,
                                                        PGC_POSTMASTER, PGC_S_ENV_VAR);
                }
index cd503c0ec2d72403322141b52cb15cd6c7c4302e..a02da9801163dc5b378132671ecf95e991a20791 100644 (file)
@@ -4006,7 +4006,7 @@ $$ language plpgsql;
 -- "limit" is to prevent this from being inlined
 create function sql_recurse(float8) returns float8 as
 $$ select recurse($1) limit 1; $$ language sql;
-select recurse(5);
+select recurse(10);
  recurse 
 ---------
        0
index 14294b6dc491ff30e552514cb7d4339790378f8b..015fbd6317e25487dd3bc9f4e23ac12e4854dab4 100644 (file)
@@ -3211,7 +3211,7 @@ $$ language plpgsql;
 create function sql_recurse(float8) returns float8 as
 $$ select recurse($1) limit 1; $$ language sql;
 
-select recurse(5);
+select recurse(10);
 
 create function error1(text) returns text language sql as
 $$ SELECT relname::text FROM pg_class c WHERE c.oid = $1::regclass $$;