From fc2c1e4385d1b70e891548de7eb238cd4b4571aa Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 17 Mar 2016 21:29:52 +0100 Subject: [PATCH] MDEV-9733 Server crashes in lf_pinbox_real_free on replication slaves don't allocate all the stack, leave some stack for function calls. To test I added the following line: alloca_size = available_stack_size() - X at X=4096 or less mysqld crashed, at 8192 mtr test passed. --- mysys/lf_alloc-pin.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c index 6ab6ba3aae035..59f60f06696df 100644 --- a/mysys/lf_alloc-pin.c +++ b/mysys/lf_alloc-pin.c @@ -103,6 +103,12 @@ #include #include +/* + when using alloca() leave at least that many bytes of the stack - + for functions we might be calling from within this stack frame +*/ +#define ALLOCA_SAFETY_MARGIN 8192 + #define LF_PINBOX_MAX_PINS 65536 static void _lf_pinbox_real_free(LF_PINS *pins); @@ -349,7 +355,8 @@ static void _lf_pinbox_real_free(LF_PINS *pins) { int alloca_size= sizeof(void *)*LF_PINBOX_PINS*npins; /* create a sorted list of pinned addresses, to speed up searches */ - if (available_stack_size(&pinbox, *pins->stack_ends_here) > alloca_size) + if (available_stack_size(&pinbox, *pins->stack_ends_here) > + alloca_size + ALLOCA_SAFETY_MARGIN) { struct st_harvester hv; addr= (void **) alloca(alloca_size);