diff --git a/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.result b/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.result index 7e6a1a180a6..d0ab97e6734 100644 --- a/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.result +++ b/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.result @@ -359,4 +359,13 @@ ERROR HY000: Incorrect XMLTYPE value: 'a' SET sql_mode= default; DROP PROCEDURE sp; DROP TABLE t; +# +# MDEV-39653 AddressSanitizer: heap-use-after-free in my_mb_wc_latin1/../Field_xmltype::store after invalid xml. +# +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2),(3),(4); +CREATE TABLE t2 (x XMLTYPE not null); +INSERT IGNORE INTO t2 SELECT i FROM t1; +ERROR HY000: Incorrect XMLTYPE value: '1' +DROP TABLE t1, t2; # End of 12.3 tests diff --git a/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.test b/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.test index 0660c9bf91b..4118b851fe9 100644 --- a/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.test +++ b/plugin/type_xmltype/mysql-test/type_xmltype/type_xmltype.test @@ -289,4 +289,17 @@ SET sql_mode= default; DROP PROCEDURE sp; DROP TABLE t; +--echo # +--echo # MDEV-39653 AddressSanitizer: heap-use-after-free in my_mb_wc_latin1/../Field_xmltype::store after invalid xml. +--echo # + +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2),(3),(4); + +CREATE TABLE t2 (x XMLTYPE not null); +--error ER_WRONG_VALUE +INSERT IGNORE INTO t2 SELECT i FROM t1; + +DROP TABLE t1, t2; + --echo # End of 12.3 tests diff --git a/plugin/type_xmltype/sql_type_xmltype.cc b/plugin/type_xmltype/sql_type_xmltype.cc index 5c2d0ac1b8b..89c94315444 100644 --- a/plugin/type_xmltype/sql_type_xmltype.cc +++ b/plugin/type_xmltype/sql_type_xmltype.cc @@ -216,13 +216,13 @@ int Field_xmltype::store(const char *from, size_t length, CHARSET_INFO *cs) return Field_blob::store(from, length, cs); err: + my_error(ER_WRONG_VALUE, MYF(0), + "XMLTYPE", ErrConvString(from, length, cs).ptr()); + if (maybe_null()) set_null(); else Field_blob::store(STRING_WITH_LEN(""), cs); - - my_error(ER_WRONG_VALUE, MYF(0), - "XMLTYPE", ErrConvString(from, length, cs).ptr()); return -1; }