1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-11441 Server crashes in String::append /Item_func_json_extract::val_str.

Wrong 'value_lengh' taken
This commit is contained in:
Alexey Botchkov
2016-12-03 10:53:12 +04:00
parent 1e2b46d5d5
commit b28626e842
3 changed files with 9 additions and 12 deletions

View File

@ -90,7 +90,7 @@ json_contains_path('{"key1":1, "key2":[2,3]}', "aLl", "$.key1", "$.key2")
1
select json_extract('{"key1":"asd", "key2":[2,3]}', "$.key1");
json_extract('{"key1":"asd", "key2":[2,3]}', "$.key1")
asd
"asd"
select json_extract('{"key1":"asd", "key2":[2,3]}', "$.keyX", "$.keyY");
json_extract('{"key1":"asd", "key2":[2,3]}', "$.keyX", "$.keyY")
NULL
@ -102,7 +102,10 @@ json_extract('{"key1":5, "key2":[2,3]}', "$.key1", "$.key2")
[5, [2,3]]
select json_extract('{"key0":true, "key1":"qwe"}', "$.key1");
json_extract('{"key0":true, "key1":"qwe"}', "$.key1")
qwe
"qwe"
select json_extract(json_object('foo', 'foobar'),'$');
json_extract(json_object('foo', 'foobar'),'$')
{"foo": "foobar"}
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word');
json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word')
{"a":1, "b":{"c":1, "k1":"word"}, "d":[1, 2]}

View File

@ -41,6 +41,7 @@ select json_extract('{"key1":"asd", "key2":[2,3]}', "$.keyX", "$.keyY");
select json_extract('{"key1":"asd", "key2":[2,3]}', "$.key1", "$.key2");
select json_extract('{"key1":5, "key2":[2,3]}', "$.key1", "$.key2");
select json_extract('{"key0":true, "key1":"qwe"}', "$.key1");
select json_extract(json_object('foo', 'foobar'),'$');
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word');
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.d[3]', 3);

View File

@ -427,8 +427,8 @@ String *Item_func_json_extract::val_str(String *str)
json_engine_t je;
bool multiple_values_found= FALSE;
const uchar *value;
const char *first_value= NULL, *first_p_value;
uint n_arg, v_len, first_len, first_p_len;
const char *first_value= NULL;
uint n_arg, v_len, first_len;
uint array_counters[JSON_DEPTH_LIMIT];
if ((null_value= args[0]->null_value))
@ -487,13 +487,6 @@ String *Item_func_json_extract::val_str(String *str)
*/
first_value= (const char *) value;
first_len= v_len;
/*
We need this as we have to preserve quotes around string
constants if we use the value to create an array. Otherwise
we get the value without the quotes.
*/
first_p_value= (const char *) je.value;
first_p_len= je.value_len;
continue;
}
else
@ -519,7 +512,7 @@ String *Item_func_json_extract::val_str(String *str)
if (multiple_values_found ?
str->append("]") :
str->append(first_p_value, first_p_len))
str->append(first_value, first_len))
goto error; /* Out of memory. */
return str;