diff options
author | Sergei Golubchik <serg@mariadb.org> | 2016-03-17 21:29:52 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2016-03-17 21:30:33 +0100 |
commit | fc2c1e4385d1b70e891548de7eb238cd4b4571aa (patch) | |
tree | adf46b80f17a07cdf1515039b49e3b7bfc10a046 | |
parent | 0b9fb9aea98dbe727ea0693ba91679b61885dcd9 (diff) | |
download | mariadb-git-fc2c1e4385d1b70e891548de7eb238cd4b4571aa.tar.gz |
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.
-rw-r--r-- | mysys/lf_alloc-pin.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c index 6ab6ba3aae0..59f60f06696 100644 --- a/mysys/lf_alloc-pin.c +++ b/mysys/lf_alloc-pin.c @@ -103,6 +103,12 @@ #include <my_sys.h> #include <lf.h> +/* + 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); |