Commit 09ea2dc7 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-33209 Stack overflow in main.json_debug_nonembedded due to incorrect debug injection

In the JSON functions, the debug injection for stack overflows is
inaccurate and may cause actual stack overflows. Let us simply
inject stack overflow errors without actually relying on the ability
of check_stack_overrun() to do so.

Reviewed by: Rucha Deodhar
parent 015f69a7
...@@ -20,20 +20,14 @@ ...@@ -20,20 +20,14 @@
#include "item.h" #include "item.h"
#include "sql_parse.h" // For check_stack_overrun #include "sql_parse.h" // For check_stack_overrun
/* #ifndef DBUG_OFF
Allocating memory and *also* using it (reading and static int dbug_json_check_min_stack_requirement()
writing from it) because some build instructions cause {
compiler to optimize out stack_used_up. Since alloca() my_error(ER_STACK_OVERRUN_NEED_MORE, MYF(ME_FATAL),
here depends on stack_used_up, it doesnt get executed my_thread_stack_size, my_thread_stack_size, STACK_MIN_SIZE);
correctly and causes json_debug_nonembedded to fail return 1;
( --error ER_STACK_OVERRUN_NEED_MORE does not occur). }
*/ #endif
#define ALLOCATE_MEM_ON_STACK(A) do \
{ \
uchar *array= (uchar*)alloca(A); \
bzero(array, A); \
my_checksum(0, array, A); \
} while(0)
/* /*
Compare ASCII string against the string with the specified Compare ASCII string against the string with the specified
...@@ -151,11 +145,8 @@ int json_path_parts_compare( ...@@ -151,11 +145,8 @@ int json_path_parts_compare(
int res, res2; int res, res2;
DBUG_EXECUTE_IF("json_check_min_stack_requirement", DBUG_EXECUTE_IF("json_check_min_stack_requirement",
{ return dbug_json_check_min_stack_requirement(););
long arbitrary_var;
long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var));
ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE);
});
if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL))
return 1; return 1;
...@@ -1210,11 +1201,7 @@ static int check_contains(json_engine_t *js, json_engine_t *value) ...@@ -1210,11 +1201,7 @@ static int check_contains(json_engine_t *js, json_engine_t *value)
json_engine_t loc_js; json_engine_t loc_js;
bool set_js; bool set_js;
DBUG_EXECUTE_IF("json_check_min_stack_requirement", DBUG_EXECUTE_IF("json_check_min_stack_requirement",
{ return dbug_json_check_min_stack_requirement(););
long arbitrary_var;
long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var));
ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE);
});
if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL))
return 1; return 1;
...@@ -2128,13 +2115,8 @@ String *Item_func_json_object::val_str(String *str) ...@@ -2128,13 +2115,8 @@ String *Item_func_json_object::val_str(String *str)
static int do_merge(String *str, json_engine_t *je1, json_engine_t *je2) static int do_merge(String *str, json_engine_t *je1, json_engine_t *je2)
{ {
DBUG_EXECUTE_IF("json_check_min_stack_requirement", DBUG_EXECUTE_IF("json_check_min_stack_requirement",
{ return dbug_json_check_min_stack_requirement(););
long arbitrary_var;
long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var));
ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE);
});
if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL))
return 1; return 1;
...@@ -2471,11 +2453,7 @@ static int do_merge_patch(String *str, json_engine_t *je1, json_engine_t *je2, ...@@ -2471,11 +2453,7 @@ static int do_merge_patch(String *str, json_engine_t *je1, json_engine_t *je2,
bool *empty_result) bool *empty_result)
{ {
DBUG_EXECUTE_IF("json_check_min_stack_requirement", DBUG_EXECUTE_IF("json_check_min_stack_requirement",
{ return dbug_json_check_min_stack_requirement(););
long arbitrary_var;
long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var));
ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE);
});
if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL))
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment