From ecf834b96f5f1a265aebe9849c5e3c3a516602bf Mon Sep 17 00:00:00 2001 From: Tor Didriksen Date: Tue, 26 Mar 2013 08:22:45 +0100 Subject: [PATCH] Bug#62856 Check for "stack overrun" doesn't work with gcc-4.6, server crashes Bug#13243248 CHECK FOR "STACK OVERRUN" DOESN'T WORK WITH GCC-4.6, SERVER CRASHES The existing check for stack direction may give wrong results for new versions of gcc at high optimization levels. Solution: Backport the stack-direction check from 5.5 --- config/ac-macros/misc.m4 | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/config/ac-macros/misc.m4 b/config/ac-macros/misc.m4 index 996ac62e025..2d06d5609be 100644 --- a/config/ac-macros/misc.m4 +++ b/config/ac-macros/misc.m4 @@ -460,22 +460,23 @@ AC_DEFUN([MYSQL_STACK_DIRECTION], #if defined(__HP_cc) || defined (__HP_aCC) || defined (__hpux) #pragma noinline #endif - int find_stack_direction () - { - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; - } - int main () - { - exit (find_stack_direction() < 0); - }], ac_cv_c_stack_direction=1, ac_cv_c_stack_direction=-1, + /* Check stack direction (-1 down, 1 up) */ + int f(int *a) + { + int b; + return(&b > a)?1:-1; + } + /* + Prevent compiler optimizations by calling function + through pointer. + */ + volatile int (*ptr_f)(int *) = f; + int main() + { + int a; + exit(ptr_f(&a) < 0); + } + ], ac_cv_c_stack_direction=1, ac_cv_c_stack_direction=-1, ac_cv_c_stack_direction=)]) AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) ])dnl