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

MDEV-26724 Endless loop in json_escape_to_string upon ... empty string

Correctly handle empty string when [un]escaping JSON
This commit is contained in:
Sergei Petrunia
2021-10-01 14:15:17 +03:00
parent 61cd4f4412
commit 5c709ef18c
3 changed files with 28 additions and 2 deletions

View File

@ -7853,3 +7853,19 @@ test.t1 analyze status OK
select * from t1 where a = 'foo'; select * from t1 where a = 'foo';
a a
drop table t1; drop table t1;
#
# MDEV-26724 Endless loop in json_escape_to_string upon ... empty string
#
CREATE TABLE t1 (f VARCHAR(8));
INSERT INTO t1 VALUES ('a'),(''),('b');
SET histogram_type=JSON_HB;
ANALYZE TABLE t PERSISTENT FOR ALL;
Table Op Msg_type Msg_text
test.t analyze Error Table 'test.t' doesn't exist
test.t analyze status Operation failed
select * from t1;
f
a
b
drop table t1;

View File

@ -193,3 +193,13 @@ analyze table t1 persistent for all;
select * from t1 where a = 'foo'; select * from t1 where a = 'foo';
drop table t1; drop table t1;
--echo #
--echo # MDEV-26724 Endless loop in json_escape_to_string upon ... empty string
--echo #
CREATE TABLE t1 (f VARCHAR(8));
INSERT INTO t1 VALUES ('a'),(''),('b');
SET histogram_type=JSON_HB;
ANALYZE TABLE t PERSISTENT FOR ALL;
select * from t1;
drop table t1;

View File

@ -41,7 +41,7 @@ static bool json_unescape_to_string(const char *val, int val_len, String* out)
(const uchar*)val + val_len, (const uchar*)val + val_len,
&my_charset_utf8mb4_bin, &my_charset_utf8mb4_bin,
buf, buf + out->length()); buf, buf + out->length());
if (res > 0) if (res >= 0)
{ {
out->length(res); out->length(res);
return false; // Ok return false; // Ok
@ -74,7 +74,7 @@ static bool json_escape_to_string(const char *val, int val_len, String* out)
(const uchar*)val + val_len, (const uchar*)val + val_len,
&my_charset_utf8mb4_bin, &my_charset_utf8mb4_bin,
buf, buf + out->length()); buf, buf + out->length());
if (res > 0) if (res >= 0)
{ {
out->length(res); out->length(res);
return false; // Ok return false; // Ok