summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/func_json.result9
-rw-r--r--mysql-test/main/func_json.test7
-rw-r--r--strings/json_lib.c4
3 files changed, 19 insertions, 1 deletions
diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result
index 4faa6f44f9f..b6f49c82895 100644
--- a/mysql-test/main/func_json.result
+++ b/mysql-test/main/func_json.result
@@ -942,5 +942,14 @@ def json_depnth 3 10 1 N 32897 0 63
json_length json_depnth
2 3
#
+# MDEV-19670 json escaped unicode parse error
+#
+SELECT json_valid('{"value":"\\ud83d\\ude0a"}');
+json_valid('{"value":"\\ud83d\\ude0a"}')
+1
+SELECT json_valid('{"test": "\\ud83d\\ude0b"}');
+json_valid('{"test": "\\ud83d\\ude0b"}')
+1
+#
# End of 10.3 tests
#
diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test
index 33f8a598670..ccee538e74f 100644
--- a/mysql-test/main/func_json.test
+++ b/mysql-test/main/func_json.test
@@ -562,5 +562,12 @@ SELECT
--disable_metadata
--echo #
+--echo # MDEV-19670 json escaped unicode parse error
+--echo #
+
+SELECT json_valid('{"value":"\\ud83d\\ude0a"}');
+SELECT json_valid('{"test": "\\ud83d\\ude0b"}');
+
+--echo #
--echo # End of 10.3 tests
--echo #
diff --git a/strings/json_lib.c b/strings/json_lib.c
index 24c79cb9044..77b41dceb20 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -320,15 +320,17 @@ static int json_handle_esc(json_string_t *s)
if (s->c_next != '\\')
return s->error= JE_SYN;
+ s->c_str+= c_len;
if ((c_len= json_next_char(s)) <= 0)
return s->error= json_eos(s) ? JE_EOS : JE_BAD_CHR;
if (s->c_next != 'u')
return s->error= JE_SYN;
+ s->c_str+= c_len;
if (read_4_hexdigits(s, code+2))
return 1;
- if ((c_len= my_utf16_uni(0, &s->c_next, code, code+4)) == 2)
+ if ((c_len= my_utf16_uni(0, &s->c_next, code, code+4)) == 4)
return 0;
}
return s->error= JE_BAD_CHR;