[MDEV-18882] ASAN heap-use-after-free in Binary_string::copy or String::copy upon MAKE_SET Created: 2019-03-11  Updated: 2023-04-27

Status: Confirmed
Project: MariaDB Server
Component/s: Data types
Affects Version/s: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6
Fix Version/s: 10.4, 10.5, 10.6

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Alexander Barkov
Resolution: Unresolved Votes: 0
Labels: None


 Description   

--source include/have_innodb.inc
 
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1),(2);
SELECT COUNT(*) FROM t1 ORDER BY MAKE_SET('1974-05-06', b'1', CONVERT(0.0, CHAR(6)), 1);
 
# Cleanup
DROP TABLE t1;

10.4 ASAN 5a796f1f

==28679==ERROR: AddressSanitizer: heap-use-after-free on address 0x60c0000453b0 at pc 0x555c3f2a6277 bp 0x7f4a2687e9c0 sp 0x7f4a2687e9b8
READ of size 3 at 0x60c0000453b0 thread T27
    #0 0x555c3f2a6276 in Binary_string::copy(Binary_string const&) /data/src/10.4/sql/sql_string.cc:230
    #1 0x555c3efc948d in String::copy(String const&) /data/src/10.4/sql/sql_string.h:816
    #2 0x555c3fa0f418 in Item_func_make_set::val_str(String*) /data/src/10.4/sql/item_strfunc.cc:2851
    #3 0x555c3f8ad3a4 in Item_copy_string::copy() /data/src/10.4/sql/item.cc:4777
    #4 0x555c3f1f24e4 in copy_fields(TMP_TABLE_PARAM*) /data/src/10.4/sql/sql_select.cc:24614
    #5 0x555c3f1dc9c7 in end_send_group(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:21411
    #6 0x555c3f1d2dff in evaluate_join_record /data/src/10.4/sql/sql_select.cc:20238
    #7 0x555c3f1d19d9 in sub_select(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:20018
    #8 0x555c3f1cfce4 in do_select /data/src/10.4/sql/sql_select.cc:19556
    #9 0x555c3f168f6c in JOIN::exec_inner() /data/src/10.4/sql/sql_select.cc:4371
    #10 0x555c3f166867 in JOIN::exec() /data/src/10.4/sql/sql_select.cc:4153
    #11 0x555c3f16a344 in mysql_select(THD*, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /data/src/10.4/sql/sql_select.cc:4585
    #12 0x555c3f14092a in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.4/sql/sql_select.cc:424
    #13 0x555c3f0c16e7 in execute_sqlcom_select /data/src/10.4/sql/sql_parse.cc:6651
    #14 0x555c3f0ae2ae in mysql_execute_command(THD*) /data/src/10.4/sql/sql_parse.cc:3888
    #15 0x555c3f0c9f8a in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.4/sql/sql_parse.cc:8204
    #16 0x555c3f0a1f07 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.4/sql/sql_parse.cc:1829
    #17 0x555c3f09ed58 in do_command(THD*) /data/src/10.4/sql/sql_parse.cc:1358
    #18 0x555c3f432921 in do_handle_one_connection(CONNECT*) /data/src/10.4/sql/sql_connect.cc:1399
    #19 0x555c3f43231a in handle_one_connection /data/src/10.4/sql/sql_connect.cc:1302
    #20 0x555c3fff9888 in pfs_spawn_thread /data/src/10.4/storage/perfschema/pfs.cc:1862
    #21 0x7f4a32258493 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x7493)
    #22 0x7f4a3063e93e in __clone (/lib/x86_64-linux-gnu/libc.so.6+0xe893e)
 
0x60c0000453b0 is located 112 bytes inside of 124-byte region [0x60c000045340,0x60c0000453bc)
freed by thread T27 here:
    #0 0x7f4a324c2527 in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x54527)
    #1 0x555c409aaa69 in free_memory /data/src/10.4/mysys/safemalloc.c:279
    #2 0x555c409aa06f in sf_free /data/src/10.4/mysys/safemalloc.c:197
    #3 0x555c4097aab8 in my_free /data/src/10.4/mysys/my_malloc.c:222
    #4 0x555c3ee0cce7 in Binary_string::free() /data/src/10.4/sql/sql_string.h:604
    #5 0x555c3f2a4eaa in Binary_string::real_alloc(unsigned long) /data/src/10.4/sql/sql_string.cc:43
    #6 0x555c3ee2cb29 in Binary_string::alloc(unsigned long) /data/src/10.4/sql/sql_string.h:613
    #7 0x555c3f2a56ea in String::set_int(long long, bool, charset_info_st const*) /data/src/10.4/sql/sql_string.cc:126
    #8 0x555c3f8a34b3 in Item_int::val_str(String*) /data/src/10.4/sql/item.cc:3465
    #9 0x555c3fa0f2df in Item_func_make_set::val_str(String*) /data/src/10.4/sql/item_strfunc.cc:2831
    #10 0x555c3f8ad3a4 in Item_copy_string::copy() /data/src/10.4/sql/item.cc:4777
    #11 0x555c3f1f24e4 in copy_fields(TMP_TABLE_PARAM*) /data/src/10.4/sql/sql_select.cc:24614
    #12 0x555c3f1dc9c7 in end_send_group(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:21411
    #13 0x555c3f1d2dff in evaluate_join_record /data/src/10.4/sql/sql_select.cc:20238
    #14 0x555c3f1d19d9 in sub_select(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:20018
    #15 0x555c3f1cfce4 in do_select /data/src/10.4/sql/sql_select.cc:19556
    #16 0x555c3f168f6c in JOIN::exec_inner() /data/src/10.4/sql/sql_select.cc:4371
    #17 0x555c3f166867 in JOIN::exec() /data/src/10.4/sql/sql_select.cc:4153
    #18 0x555c3f16a344 in mysql_select(THD*, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /data/src/10.4/sql/sql_select.cc:4585
    #19 0x555c3f14092a in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.4/sql/sql_select.cc:424
    #20 0x555c3f0c16e7 in execute_sqlcom_select /data/src/10.4/sql/sql_parse.cc:6651
    #21 0x555c3f0ae2ae in mysql_execute_command(THD*) /data/src/10.4/sql/sql_parse.cc:3888
    #22 0x555c3f0c9f8a in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.4/sql/sql_parse.cc:8204
    #23 0x555c3f0a1f07 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.4/sql/sql_parse.cc:1829
    #24 0x555c3f09ed58 in do_command(THD*) /data/src/10.4/sql/sql_parse.cc:1358
    #25 0x555c3f432921 in do_handle_one_connection(CONNECT*) /data/src/10.4/sql/sql_connect.cc:1399
    #26 0x555c3f43231a in handle_one_connection /data/src/10.4/sql/sql_connect.cc:1302
    #27 0x555c3fff9888 in pfs_spawn_thread /data/src/10.4/storage/perfschema/pfs.cc:1862
    #28 0x7f4a32258493 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x7493)
 
previously allocated by thread T27 here:
    #0 0x7f4a324c273f in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x5473f)
    #1 0x555c409a97df in sf_malloc /data/src/10.4/mysys/safemalloc.c:118
    #2 0x555c4097a0da in my_malloc /data/src/10.4/mysys/my_malloc.c:101
    #3 0x555c3f2a4f09 in Binary_string::real_alloc(unsigned long) /data/src/10.4/sql/sql_string.cc:46
    #4 0x555c3ee2cb29 in Binary_string::alloc(unsigned long) /data/src/10.4/sql/sql_string.h:613
    #5 0x555c3fb9bac1 in my_decimal::to_string_native(String*, unsigned int, unsigned int, char, unsigned int) const /data/src/10.4/sql/my_decimal.cc:118
    #6 0x555c3ee2de0e in my_decimal::to_string(String*, unsigned int, unsigned int, char) const /data/src/10.4/sql/my_decimal.h:204
    #7 0x555c3ee2de4f in my_decimal::to_string(String*) const /data/src/10.4/sql/my_decimal.h:208
    #8 0x555c3f8e0213 in Item_decimal::val_str(String*) /data/src/10.4/sql/item.h:4163
    #9 0x555c3fabb312 in Item_char_typecast::val_str(String*) /data/src/10.4/sql/item_timefunc.cc:2338
    #10 0x555c3fa0f2df in Item_func_make_set::val_str(String*) /data/src/10.4/sql/item_strfunc.cc:2831
    #11 0x555c3f8ad3a4 in Item_copy_string::copy() /data/src/10.4/sql/item.cc:4777
    #12 0x555c3f1f24e4 in copy_fields(TMP_TABLE_PARAM*) /data/src/10.4/sql/sql_select.cc:24614
    #13 0x555c3f1dc9c7 in end_send_group(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:21411
    #14 0x555c3f1d2dff in evaluate_join_record /data/src/10.4/sql/sql_select.cc:20238
    #15 0x555c3f1d19d9 in sub_select(JOIN*, st_join_table*, bool) /data/src/10.4/sql/sql_select.cc:20018
    #16 0x555c3f1cfce4 in do_select /data/src/10.4/sql/sql_select.cc:19556
    #17 0x555c3f168f6c in JOIN::exec_inner() /data/src/10.4/sql/sql_select.cc:4371
    #18 0x555c3f166867 in JOIN::exec() /data/src/10.4/sql/sql_select.cc:4153
    #19 0x555c3f16a344 in mysql_select(THD*, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /data/src/10.4/sql/sql_select.cc:4585
    #20 0x555c3f14092a in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.4/sql/sql_select.cc:424
    #21 0x555c3f0c16e7 in execute_sqlcom_select /data/src/10.4/sql/sql_parse.cc:6651
    #22 0x555c3f0ae2ae in mysql_execute_command(THD*) /data/src/10.4/sql/sql_parse.cc:3888
    #23 0x555c3f0c9f8a in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.4/sql/sql_parse.cc:8204
    #24 0x555c3f0a1f07 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.4/sql/sql_parse.cc:1829
    #25 0x555c3f09ed58 in do_command(THD*) /data/src/10.4/sql/sql_parse.cc:1358
    #26 0x555c3f432921 in do_handle_one_connection(CONNECT*) /data/src/10.4/sql/sql_connect.cc:1399
    #27 0x555c3f43231a in handle_one_connection /data/src/10.4/sql/sql_connect.cc:1302
    #28 0x555c3fff9888 in pfs_spawn_thread /data/src/10.4/storage/perfschema/pfs.cc:1862
    #29 0x7f4a32258493 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x7493)
 
Thread T27 created by T0 here:
    #0 0x7f4a32491bba in pthread_create (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x23bba)
    #1 0x555c3fff9e50 in spawn_thread_v1 /data/src/10.4/storage/perfschema/pfs.cc:1912
    #2 0x555c3edea476 in inline_mysql_thread_create /data/src/10.4/include/mysql/psi/mysql_thread.h:1268
    #3 0x555c3edff6ed in create_thread_to_handle_connection(CONNECT*) /data/src/10.4/sql/mysqld.cc:6141
    #4 0x555c3edffdf2 in create_new_thread(CONNECT*) /data/src/10.4/sql/mysqld.cc:6211
    #5 0x555c3ee00182 in handle_accepted_socket(st_mysql_socket, st_mysql_socket) /data/src/10.4/sql/mysqld.cc:6309
    #6 0x555c3ee00dce in handle_connections_sockets() /data/src/10.4/sql/mysqld.cc:6467
    #7 0x555c3edfef28 in mysqld_main(int, char**) /data/src/10.4/sql/mysqld.cc:5799
    #8 0x555c3ede82ff in main /data/src/10.4/sql/main.cc:25
    #9 0x7f4a305762b0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202b0)
 
SUMMARY: AddressSanitizer: heap-use-after-free /data/src/10.4/sql/sql_string.cc:230 Binary_string::copy(Binary_string const&)
Shadow bytes around the buggy address:
  0x0c1880000a20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c1880000a30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c1880000a40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c1880000a50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c1880000a60: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
=>0x0c1880000a70: fd fd fd fd fd fd[fd]fd fa fa fa fa fa fa fa fa
  0x0c1880000a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c1880000a90: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x0c1880000aa0: fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa
  0x0c1880000ab0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c1880000ac0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Heap right redzone:      fb
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack partial redzone:   f4
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Contiguous container OOB:fc
  ASan internal:           fe
==28679==ABORTING

10.1 ASAN 6567636b

==30187==ERROR: AddressSanitizer: heap-use-after-free on address 0x60c0000b04b0 at pc 0x55c96a066818 bp 0x7f5c974026b0 sp 0x7f5c974026a8
READ of size 3 at 0x60c0000b04b0 thread T23
    #0 0x55c96a066817 in String::copy(String const&) /data/src/10.1/sql/sql_string.cc:176
    #1 0x55c96a57d5c7 in Item_func_make_set::val_str(String*) /data/src/10.1/sql/item_strfunc.cc:2785
    #2 0x55c96a425c97 in Item_copy_string::copy() /data/src/10.1/sql/item.cc:4063
    #3 0x55c969fb0cfb in copy_fields(TMP_TABLE_PARAM*) /data/src/10.1/sql/sql_select.cc:23163
    #4 0x55c969fbee35 in end_send_group(JOIN*, st_join_table*, bool) /data/src/10.1/sql/sql_select.cc:19816
    #5 0x55c969f544d2 in evaluate_join_record /data/src/10.1/sql/sql_select.cc:18702
    #6 0x55c969f7011d in sub_select(JOIN*, st_join_table*, bool) /data/src/10.1/sql/sql_select.cc:18479
    #7 0x55c969fa96f0 in do_select /data/src/10.1/sql/sql_select.cc:18134
    #8 0x55c969fee26e in JOIN::exec_inner() /data/src/10.1/sql/sql_select.cc:3275
    #9 0x55c969fef556 in JOIN::exec() /data/src/10.1/sql/sql_select.cc:2562
    #10 0x55c969fe3da9 in mysql_select(THD*, Item***, TABLE_LIST*, unsigned int, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /data/src/10.1/sql/sql_select.cc:3499
    #11 0x55c969fe4597 in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.1/sql/sql_select.cc:388
    #12 0x55c969eb3603 in execute_sqlcom_select /data/src/10.1/sql/sql_parse.cc:5991
    #13 0x55c969ecd94d in mysql_execute_command(THD*) /data/src/10.1/sql/sql_parse.cc:3042
    #14 0x55c969ee5af0 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /data/src/10.1/sql/sql_parse.cc:7509
    #15 0x55c969eec8a2 in dispatch_command(enum_server_command, THD*, char*, unsigned int) /data/src/10.1/sql/sql_parse.cc:1496
    #16 0x55c969ef3074 in do_command(THD*) /data/src/10.1/sql/sql_parse.cc:1124
    #17 0x55c96a19b5e7 in do_handle_one_connection(THD*) /data/src/10.1/sql/sql_connect.cc:1330
    #18 0x55c96a19baf8 in handle_one_connection /data/src/10.1/sql/sql_connect.cc:1242
    #19 0x55c96aa6b24e in pfs_spawn_thread /data/src/10.1/storage/perfschema/pfs.cc:1861
    #20 0x7f5cb068b493 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x7493)
    #21 0x7f5caea4493e in __clone (/lib/x86_64-linux-gnu/libc.so.6+0xe893e)
 
0x60c0000b04b0 is located 112 bytes inside of 124-byte region [0x60c0000b0440,0x60c0000b04bc)
freed by thread T23 here:
    #0 0x7f5cb08f5527 in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x54527)
    #1 0x55c96b2377cf in free_memory /data/src/10.1/mysys/safemalloc.c:276
 
previously allocated by thread T23 here:
    #0 0x7f5cb08f573f in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x5473f)
    #1 0x55c96b2378a0 in sf_malloc /data/src/10.1/mysys/safemalloc.c:115
    #2 0x55c96b3302da (/data/bld/10.1-asan/bin/mysqld+0x1da02da)
 
Thread T23 created by T0 here:
    #0 0x7f5cb08c4bba in pthread_create (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x23bba)
    #1 0x55c96aa76aa5 in spawn_thread_v1 /data/src/10.1/storage/perfschema/pfs.cc:1911
 
SUMMARY: AddressSanitizer: heap-use-after-free /data/src/10.1/sql/sql_string.cc:176 String::copy(String const&)
Shadow bytes around the buggy address:
  0x0c188000e040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c188000e050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c188000e060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c188000e070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c188000e080: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
=>0x0c188000e090: fd fd fd fd fd fd[fd]fd fa fa fa fa fa fa fa fa
  0x0c188000e0a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c188000e0b0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x0c188000e0c0: fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa
  0x0c188000e0d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04
  0x0c188000e0e0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Heap right redzone:      fb
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack partial redzone:   f4
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Contiguous container OOB:fc
  ASan internal:           fe
==30187==ABORTING

No obvious problems on non-ASAN builds, only the warning

Warnings:
Warning	1292	Truncated incorrect INTEGER value: '1974-05-06'

but it might be expected.


Generated at Thu Feb 08 08:47:27 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.