UBSAN: runtime error: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER, and applying zero offset to null pointer in _ma_unique_hash, my_hash_sort_bin and _ma_unique_comp
MDEV-35620UBSAN: runtime error: applying zero offset to null pointer in _ma_unique_hash, skip_trailing_space, my_hash_sort_mb_nopad_bin and my_strnncollsp_utf8mb4_bin
UBSAN: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER and runtime error: load of value 3200171710, which is not a valid value for type 'geometry_type'
UBSAN: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER
Roel Van de Paar
added a comment - - edited Additional testcase leading to similar but slightly different stack
SET SQL_MODE= '' ;
CREATE TABLE t (c INT ,d BLOB (1) NOT NULL , INDEX (c,d(1))) ENGINE=Aria;
INSERT INTO t (c) VALUES (0);
Leads to:
11.0.2 368dd22a816f3b437bccd0b9ff28b9de9b1abf0a (Debug, UBASAN)
/test/11.0_dbg_san/storage/maria/ma_key.c:279:7: runtime error: null pointer passed as argument 2, which is declared to never be null
11.0.2 368dd22a816f3b437bccd0b9ff28b9de9b1abf0a (Debug, UBASAN)
#0 0x558073758037 in _ma_make_key /test/11.0_dbg_san/storage/maria/ma_key.c:279
#1 0x5580737c2ee8 in maria_write /test/11.0_dbg_san/storage/maria/ma_write.c:189
#2 0x5580736458ab in ha_maria::write_row(unsigned char const*) /test/11.0_dbg_san/storage/maria/ha_maria.cc:1304
#3 0x558072442943 in handler::ha_write_row(unsigned char const*) /test/11.0_dbg_san/sql/handler.cc:7798
#4 0x558070a67f8c in write_record(THD*, TABLE*, st_copy_info*, select_result*) /test/11.0_dbg_san/sql/sql_insert.cc:2204
#5 0x558070acc88c in mysql_insert(THD*, TABLE_LIST*, List<Item>&, List<List<Item> >&, List<Item>&, List<Item>&, enum_duplicates, bool, select_result*) /test/11.0_dbg_san/sql/sql_insert.cc:1154
#6 0x558070cd700f in mysql_execute_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:4569
#7 0x558070cfc973 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.0_dbg_san/sql/sql_parse.cc:8014
#8 0x558070d0c707 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1894
#9 0x558070d1a542 in do_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1407
#10 0x5580716ef8b5 in do_handle_one_connection(CONNECT*, bool) /test/11.0_dbg_san/sql/sql_connect.cc:1416
#11 0x5580716f0dd0 in handle_one_connection /test/11.0_dbg_san/sql/sql_connect.cc:1318
#12 0x149e95a94b42 in start_thread nptl/pthread_create.c:442
#13 0x149e95b269ff (/lib/x86_64-linux-gnu/libc.so.6+0x1269ff)
Bug confirmed present in 10.2-11.1 (opt+dbg).
CREATETABLE t (c BLOB, PRIMARYKEY(c(1))) ENGINE=Aria;
INSERTINTO t VALUES (0);
UPDATE t SET c=NULL;
Produces these additional stacks/UniqueID's:
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|ha_maria::update_row|handler::ha_update_row
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|handler::ha_update_row|Sql_cmd_update::update_single_table
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|handler::ha_update_row|mysql_update
Note that without the sql_mode we get ERROR 1048 (23000): Column 'c' cannot be null.
Also, this testcase:
CREATETABLE t (c BLOB, PRIMARYKEY(c(1))) ENGINE=Aria;
INSERTINTO t VALUES (0);
UPDATE t SET c=(1+DEGREES (-1) MOD LOG2 (-1))%NULL;
11.1.2-dbg>CREATE TABLE t (c BLOB, PRIMARY KEY(c(1))) ENGINE=Aria;
Query OK, 0 rows affected (0.016 sec)
11.1.2-dbg>INSERT INTO t VALUES (0);
Query OK, 1 row affected (0.002 sec)
11.1.2-dbg>UPDATE t SET c=(1+DEGREES (-1) MOD LOG2 (-1))%NULL;
ERROR 1365 (22012): Division by 0
Which seems to be an additional rounding bug of some sort (as NULL%NULL or 0%NULL results in ERROR 1048 (23000): Column 'c' cannot be null error instead.
Roel Van de Paar
added a comment - This additional testcase:
SET sql_mode= '' ;
CREATE TABLE t (c BLOB, PRIMARY KEY (c(1))) ENGINE=Aria;
INSERT INTO t VALUES (0);
UPDATE t SET c= NULL ;
Produces these additional stacks/UniqueID's:
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|ha_maria::update_row|handler::ha_update_row
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|handler::ha_update_row|Sql_cmd_update::update_single_table
UBSAN|null pointer passed as argument 2, which is declared to never be null|storage/maria/ma_key.c|_ma_make_key|maria_update|handler::ha_update_row|mysql_update
Note that without the sql_mode we get ERROR 1048 (23000): Column 'c' cannot be null .
Also, this testcase:
CREATE TABLE t (c BLOB, PRIMARY KEY (c(1))) ENGINE=Aria;
INSERT INTO t VALUES (0);
UPDATE t SET c=(1+DEGREES (-1) MOD LOG2 (-1))% NULL ;
Leads to:
11.1.2 3883eb63dc5e663558571c33d086c9fd3aa0cf8f (Debug)
11.1.2-dbg>CREATE TABLE t (c BLOB, PRIMARY KEY(c(1))) ENGINE=Aria;
Query OK, 0 rows affected (0.016 sec)
11.1.2-dbg>INSERT INTO t VALUES (0);
Query OK, 1 row affected (0.002 sec)
11.1.2-dbg>UPDATE t SET c=(1+DEGREES (-1) MOD LOG2 (-1))%NULL;
ERROR 1365 (22012): Division by 0
Which seems to be an additional rounding bug of some sort (as NULL%NULL or 0%NULL results in ERROR 1048 (23000): Column 'c' cannot be null error instead.
CREATETABLE t1 (a INT,b BLOB NOTNULL,INDEX sk (b)) ROW_FORMAT=compact ENGINE=Aria;
INSERTINTO t1 SELECT @p,@p FROM seq_0_to_0;
Roel Van de Paar
added a comment - Please also test any fixes with
SET sql_mode= '' ;
CREATE TABLE t1 (a INT ,b BLOB NOT NULL , INDEX sk (b)) ROW_FORMAT=compact ENGINE=Aria;
INSERT INTO t1 SELECT @p,@p FROM seq_0_to_0;
/test/11.8_dbg_san/storage/maria/ma_unique.c:145:13: runtime error: applying zero offset to null pointer
#0 0x5654f1bebbce in _ma_unique_hash /test/11.8_dbg_san/storage/maria/ma_unique.c:145:13
#1 0x5654f1f9a965 in maria_write /test/11.8_dbg_san/storage/maria/ma_write.c:134:32
#2 0x5654f1c273b6 in ha_maria::write_row(unsigned char const*) /test/11.8_dbg_san/storage/maria/ha_maria.cc:1235:10
#3 0x5654ee74bbd4 in handler::ha_write_tmp_row(unsigned char*) /test/11.8_dbg_san/sql/sql_class.h:8031:3
#4 0x5654eedc287b in select_unit::write_record() /test/11.8_dbg_san/sql/sql_union.cc:417:7
#5 0x5654eedc0142 in select_unit::send_data(List<Item>&) /test/11.8_dbg_san/sql/sql_union.cc:161:9
#6 0x5654ee69dfd0 in select_result_sink::send_data_with_check(List<Item>&, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_class.h:6244:12
#7 0x5654ee661b96 in end_send(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:25427:9
#8 0x5654ee82d098 in evaluate_join_record(JOIN*, st_join_table*, int) /test/11.8_dbg_san/sql/sql_select.cc:24329:11
#9 0x5654ee52a5b1 in sub_select(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:24096:9
#10 0x5654ee6a5a95 in do_select(JOIN*, Procedure*) /test/11.8_dbg_san/sql/sql_select.cc:23607:14
#11 0x5654ee69be79 in JOIN::exec_inner() /test/11.8_dbg_san/sql/sql_select.cc:5037:50
#12 0x5654ee69456a in JOIN::exec() /test/11.8_dbg_san/sql/sql_select.cc:4820:8
#13 0x5654eee05448 in st_select_lex_unit::exec_inner() /test/11.8_dbg_san/sql/sql_union.cc:2437:27
#14 0x5654eedb8db3 in st_select_lex_unit::exec() /test/11.8_dbg_san/sql/sql_union.cc:2341:3
#15 0x5654eeda3ce2 in mysql_union(THD*, LEX*, select_result*, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_union.cc:45:16
#16 0x5654ee52d066 in handle_select(THD*, LEX*, select_result*, unsigned long long) /test/11.8_dbg_san/sql/sql_select.cc:623:10
#17 0x5654ee219ee0 in execute_sqlcom_select(THD*, TABLE_LIST*) /test/11.8_dbg_san/sql/sql_parse.cc:6177:12
#18 0x5654ee1b9dcc in mysql_execute_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:3966:12
#19 0x5654ee15fef9 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.8_dbg_san/sql/sql_parse.cc:7901:18
#20 0x5654ee140db8 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1903:7
#21 0x5654ee169e56 in do_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1416:17
#22 0x5654ef2cc556 in do_handle_one_connection(CONNECT*, bool) /test/11.8_dbg_san/sql/sql_connect.cc:1415:11
#23 0x5654ef2cad19 in handle_one_connection /test/11.8_dbg_san/sql/sql_connect.cc:1327:5
#24 0x5654ed3135fc in asan_thread_start(void*) asan_interceptors.cpp.o
#25 0x148af1a9ca93 in start_thread nptl/pthread_create.c:447:8
#26 0x148af1b29c3b in clone3 misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
/test/11.8_dbg_san/strings/ctype-bin.c:280:26: runtime error: applying zero offset to null pointer
#0 0x5654f4430b10 in my_hash_sort_bin /test/11.8_dbg_san/strings/ctype-bin.c:280:26
#1 0x5654f1bebcd7 in _ma_unique_hash /test/11.8_dbg_san/storage/maria/ma_unique.c:156:7
#2 0x5654f1f9a965 in maria_write /test/11.8_dbg_san/storage/maria/ma_write.c:134:32
#3 0x5654f1c273b6 in ha_maria::write_row(unsigned char const*) /test/11.8_dbg_san/storage/maria/ha_maria.cc:1235:10
#4 0x5654ee74bbd4 in handler::ha_write_tmp_row(unsigned char*) /test/11.8_dbg_san/sql/sql_class.h:8031:3
#5 0x5654eedc287b in select_unit::write_record() /test/11.8_dbg_san/sql/sql_union.cc:417:7
#6 0x5654eedc0142 in select_unit::send_data(List<Item>&) /test/11.8_dbg_san/sql/sql_union.cc:161:9
#7 0x5654ee69dfd0 in select_result_sink::send_data_with_check(List<Item>&, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_class.h:6244:12
#8 0x5654ee661b96 in end_send(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:25427:9
#9 0x5654ee82d098 in evaluate_join_record(JOIN*, st_join_table*, int) /test/11.8_dbg_san/sql/sql_select.cc:24329:11
#10 0x5654ee52a5b1 in sub_select(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:24096:9
#11 0x5654ee6a5a95 in do_select(JOIN*, Procedure*) /test/11.8_dbg_san/sql/sql_select.cc:23607:14
#12 0x5654ee69be79 in JOIN::exec_inner() /test/11.8_dbg_san/sql/sql_select.cc:5037:50
#13 0x5654ee69456a in JOIN::exec() /test/11.8_dbg_san/sql/sql_select.cc:4820:8
#14 0x5654eee05448 in st_select_lex_unit::exec_inner() /test/11.8_dbg_san/sql/sql_union.cc:2437:27
#15 0x5654eedb8db3 in st_select_lex_unit::exec() /test/11.8_dbg_san/sql/sql_union.cc:2341:3
#16 0x5654eeda3ce2 in mysql_union(THD*, LEX*, select_result*, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_union.cc:45:16
#17 0x5654ee52d066 in handle_select(THD*, LEX*, select_result*, unsigned long long) /test/11.8_dbg_san/sql/sql_select.cc:623:10
#18 0x5654ee219ee0 in execute_sqlcom_select(THD*, TABLE_LIST*) /test/11.8_dbg_san/sql/sql_parse.cc:6177:12
#19 0x5654ee1b9dcc in mysql_execute_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:3966:12
#20 0x5654ee15fef9 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.8_dbg_san/sql/sql_parse.cc:7901:18
#21 0x5654ee140db8 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1903:7
#22 0x5654ee169e56 in do_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1416:17
#23 0x5654ef2cc556 in do_handle_one_connection(CONNECT*, bool) /test/11.8_dbg_san/sql/sql_connect.cc:1415:11
#24 0x5654ef2cad19 in handle_one_connection /test/11.8_dbg_san/sql/sql_connect.cc:1327:5
#25 0x5654ed3135fc in asan_thread_start(void*) asan_interceptors.cpp.o
#26 0x148af1a9ca93 in start_thread nptl/pthread_create.c:447:8
#27 0x148af1b29c3b in clone3 misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
/test/11.8_dbg_san/storage/maria/ma_unique.c:262:17: runtime error: applying zero offset to null pointer
#0 0x5654f1bee217 in _ma_unique_comp /test/11.8_dbg_san/storage/maria/ma_unique.c:262:17
#1 0x5654f1be2b45 in _ma_cmp_dynamic_unique /test/11.8_dbg_san/storage/maria/ma_dynrec.c:1623:11
#2 0x5654f1be9e27 in _ma_check_unique /test/11.8_dbg_san/storage/maria/ma_unique.c:69:3
#3 0x5654f1f9ab66 in maria_write /test/11.8_dbg_san/storage/maria/ma_write.c:137:13
#4 0x5654f1c273b6 in ha_maria::write_row(unsigned char const*) /test/11.8_dbg_san/storage/maria/ha_maria.cc:1235:10
#5 0x5654ee74bbd4 in handler::ha_write_tmp_row(unsigned char*) /test/11.8_dbg_san/sql/sql_class.h:8031:3
#6 0x5654eedc287b in select_unit::write_record() /test/11.8_dbg_san/sql/sql_union.cc:417:7
#7 0x5654eedc0142 in select_unit::send_data(List<Item>&) /test/11.8_dbg_san/sql/sql_union.cc:161:9
#8 0x5654ee69dfd0 in select_result_sink::send_data_with_check(List<Item>&, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_class.h:6244:12
#9 0x5654ee661b96 in end_send(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:25427:9
#10 0x5654ee82d098 in evaluate_join_record(JOIN*, st_join_table*, int) /test/11.8_dbg_san/sql/sql_select.cc:24329:11
#11 0x5654ee52a5b1 in sub_select(JOIN*, st_join_table*, bool) /test/11.8_dbg_san/sql/sql_select.cc:24096:9
#12 0x5654ee6a5a95 in do_select(JOIN*, Procedure*) /test/11.8_dbg_san/sql/sql_select.cc:23607:14
#13 0x5654ee69be79 in JOIN::exec_inner() /test/11.8_dbg_san/sql/sql_select.cc:5037:50
#14 0x5654ee69456a in JOIN::exec() /test/11.8_dbg_san/sql/sql_select.cc:4820:8
#15 0x5654eee05448 in st_select_lex_unit::exec_inner() /test/11.8_dbg_san/sql/sql_union.cc:2437:27
#16 0x5654eedb8db3 in st_select_lex_unit::exec() /test/11.8_dbg_san/sql/sql_union.cc:2341:3
#17 0x5654eeda3ce2 in mysql_union(THD*, LEX*, select_result*, st_select_lex_unit*, unsigned long long) /test/11.8_dbg_san/sql/sql_union.cc:45:16
#18 0x5654ee52d066 in handle_select(THD*, LEX*, select_result*, unsigned long long) /test/11.8_dbg_san/sql/sql_select.cc:623:10
#19 0x5654ee219ee0 in execute_sqlcom_select(THD*, TABLE_LIST*) /test/11.8_dbg_san/sql/sql_parse.cc:6177:12
#20 0x5654ee1b9dcc in mysql_execute_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:3966:12
#21 0x5654ee15fef9 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.8_dbg_san/sql/sql_parse.cc:7901:18
#22 0x5654ee140db8 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1903:7
#23 0x5654ee169e56 in do_command(THD*, bool) /test/11.8_dbg_san/sql/sql_parse.cc:1416:17
#24 0x5654ef2cc556 in do_handle_one_connection(CONNECT*, bool) /test/11.8_dbg_san/sql/sql_connect.cc:1415:11
#25 0x5654ef2cad19 in handle_one_connection /test/11.8_dbg_san/sql/sql_connect.cc:1327:5
#26 0x5654ed3135fc in asan_thread_start(void*) asan_interceptors.cpp.o
#27 0x148af1a9ca93 in start_thread nptl/pthread_create.c:447:8
#28 0x148af1b29c3b in clone3 misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
Compiled with a recent version of Clang (I used Clang 18.1.3) with LLVM 18. Ubuntu instructions:
# Note: llvm-17-linker-tools installs /usr/lib/llvm-17/lib/LLVMgold.so, which is needed for compilation, and LLVMgold.so is no longer included in LLVM 18
export UBSAN_OPTIONS=print_stacktrace=1:report_error_type=1 # And you may also want to supress UBSAN startup issues using 'suppressions=UBSAN.filter'. For an example of UBSAN.filter, which includes current startup issues see: https://github.com/mariadb-corporation/mariadb-qa/blob/master/UBSAN.filter
UBSAN: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER
UBSAN: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER, and and runtime error: applying zero offset to null pointer in _ma_unique_hash, my_hash_sort_bin and _ma_unique_comp
UBSAN: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER, and and runtime error: applying zero offset to null pointer in _ma_unique_hash, my_hash_sort_bin and _ma_unique_comp
UBSAN: runtime error: null pointer passed as argument 2, which is declared to never be null in maria/ma_key.c on ALTER, and applying zero offset to null pointer in _ma_unique_hash, my_hash_sort_bin and _ma_unique_comp
Additional testcase leading to similar but slightly different stack
Leads to:
11.0.2 368dd22a816f3b437bccd0b9ff28b9de9b1abf0a (Debug, UBASAN)
/test/11.0_dbg_san/storage/maria/ma_key.c:279:7: runtime error: null pointer passed as argument 2, which is declared to never be null
11.0.2 368dd22a816f3b437bccd0b9ff28b9de9b1abf0a (Debug, UBASAN)
#0 0x558073758037 in _ma_make_key /test/11.0_dbg_san/storage/maria/ma_key.c:279
#1 0x5580737c2ee8 in maria_write /test/11.0_dbg_san/storage/maria/ma_write.c:189
#2 0x5580736458ab in ha_maria::write_row(unsigned char const*) /test/11.0_dbg_san/storage/maria/ha_maria.cc:1304
#3 0x558072442943 in handler::ha_write_row(unsigned char const*) /test/11.0_dbg_san/sql/handler.cc:7798
#4 0x558070a67f8c in write_record(THD*, TABLE*, st_copy_info*, select_result*) /test/11.0_dbg_san/sql/sql_insert.cc:2204
#5 0x558070acc88c in mysql_insert(THD*, TABLE_LIST*, List<Item>&, List<List<Item> >&, List<Item>&, List<Item>&, enum_duplicates, bool, select_result*) /test/11.0_dbg_san/sql/sql_insert.cc:1154
#6 0x558070cd700f in mysql_execute_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:4569
#7 0x558070cfc973 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.0_dbg_san/sql/sql_parse.cc:8014
#8 0x558070d0c707 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1894
#9 0x558070d1a542 in do_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1407
#10 0x5580716ef8b5 in do_handle_one_connection(CONNECT*, bool) /test/11.0_dbg_san/sql/sql_connect.cc:1416
#11 0x5580716f0dd0 in handle_one_connection /test/11.0_dbg_san/sql/sql_connect.cc:1318
#12 0x149e95a94b42 in start_thread nptl/pthread_create.c:442
#13 0x149e95b269ff (/lib/x86_64-linux-gnu/libc.so.6+0x1269ff)
Bug confirmed present in 10.2-11.1 (opt+dbg).