Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-24741

ASAN heap-use-after-free in String::realloc_raw on 2nd execution of PS

    XMLWordPrintable

Details

    Description

      Set to Minor, as it has been fixed in 10.4+, and the test case is not of a particular importance.

      CREATE TABLE t1 (a INT);
      INSERT INTO t1 VALUES (1),(2);
      PREPARE stmt FROM "SELECT DISTINCT @x := UUID() AS f FROM t1 GROUP BY a HAVING f != 'foo'";
      EXECUTE stmt;
      EXECUTE stmt;
       
      # Cleanup
      DROP TABLE t1;
      

      10.2 a4d4836f ASAN

      ==694087==ERROR: AddressSanitizer: heap-use-after-free on address 0x6190000877c7 at pc 0x7fa9a8500480 bp 0x7fa99d2a4c40 sp 0x7fa99d2a43e8
      READ of size 36 at 0x6190000877c7 thread T5
          #0 0x7fa9a850047f  (/lib/x86_64-linux-gnu/libasan.so.5+0x9b47f)
          #1 0x55c17ea3c005 in String::realloc_raw(unsigned long) /data/src/10.2/sql/sql_string.cc:110
          #2 0x55c17e601498 in String::realloc(unsigned long) /data/src/10.2/sql/sql_string.h:367
          #3 0x55c17f04f1c5 in Item_func_uuid::val_str(String*) /data/src/10.2/sql/item_strfunc.cc:4287
          #4 0x55c17efdf717 in Item_func_set_user_var::check(bool) /data/src/10.2/sql/item_func.cc:5089
          #5 0x55c17efe1680 in Item_func_set_user_var::save_in_field(Field*, bool, bool) /data/src/10.2/sql/item_func.cc:5379
          #6 0x55c17eff6073 in Item_func_set_user_var::save_in_field(Field*, bool) /data/src/10.2/sql/item_func.h:1988
          #7 0x55c17e7455b0 in Item_result_field::save_in_result_field(bool) /data/src/10.2/sql/item.h:2546
          #8 0x55c17e99052c in copy_funcs(Item**, THD const*) /data/src/10.2/sql/sql_select.cc:23907
          #9 0x55c17e975e74 in end_write /data/src/10.2/sql/sql_select.cc:20262
          #10 0x55c17e9a6b9e in AGGR_OP::put_record(bool) /data/src/10.2/sql/sql_select.cc:26803
          #11 0x55c17e9b4f1c in AGGR_OP::put_record() (/data/bld/10.2-asan-nightly/bin/mysqld+0xfb3f1c)
          #12 0x55c17e969ba9 in sub_select_postjoin_aggr(JOIN*, st_join_table*, bool) /data/src/10.2/sql/sql_select.cc:18579
          #13 0x55c17e96c2ca in evaluate_join_record /data/src/10.2/sql/sql_select.cc:19078
          #14 0x55c17e96ac3c in sub_select(JOIN*, st_join_table*, bool) /data/src/10.2/sql/sql_select.cc:18858
          #15 0x55c17e968d25 in do_select /data/src/10.2/sql/sql_select.cc:18402
          #16 0x55c17e902ed4 in JOIN::exec_inner() /data/src/10.2/sql/sql_select.cc:3641
          #17 0x55c17e9009eb in JOIN::exec() /data/src/10.2/sql/sql_select.cc:3436
          #18 0x55c17e9041f3 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.2/sql/sql_select.cc:3836
          #19 0x55c17e8e0c95 in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.2/sql/sql_select.cc:361
          #20 0x55c17e857b80 in execute_sqlcom_select /data/src/10.2/sql/sql_parse.cc:6248
          #21 0x55c17e844b25 in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3559
          #22 0x55c17e8b14cc in Prepared_statement::execute(String*, bool) /data/src/10.2/sql/sql_prepare.cc:5037
          #23 0x55c17e8aca98 in Prepared_statement::execute_loop(String*, bool, unsigned char*, unsigned char*) /data/src/10.2/sql/sql_prepare.cc:4466
          #24 0x55c17e8a6f6d in mysql_sql_stmt_execute(THD*) /data/src/10.2/sql/sql_prepare.cc:3574
          #25 0x55c17e844b6a in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3575
          #26 0x55c17e8610fd in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.2/sql/sql_parse.cc:7763
          #27 0x55c17e83a142 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.2/sql/sql_parse.cc:1827
          #28 0x55c17e836f01 in do_command(THD*) /data/src/10.2/sql/sql_parse.cc:1381
          #29 0x55c17ebbf430 in do_handle_one_connection(CONNECT*) /data/src/10.2/sql/sql_connect.cc:1336
          #30 0x55c17ebbecf3 in handle_one_connection /data/src/10.2/sql/sql_connect.cc:1241
          #31 0x55c17ff5b2bf in pfs_spawn_thread /data/src/10.2/storage/perfschema/pfs.cc:1869
          #32 0x7fa9a800b608 in start_thread /build/glibc-ZN95T4/glibc-2.31/nptl/pthread_create.c:477
          #33 0x7fa9a7be5292 in __clone (/lib/x86_64-linux-gnu/libc.so.6+0x122292)
       
      0x6190000877c7 is located 583 bytes inside of 1100-byte region [0x619000087580,0x6190000879cc)
      freed by thread T5 here:
          #0 0x7fa9a85727cf in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf)
          #1 0x55c180078f54 in free_memory /data/src/10.2/mysys/safemalloc.c:279
          #2 0x55c1800784a0 in sf_free /data/src/10.2/mysys/safemalloc.c:197
          #3 0x55c1800447e8 in my_free /data/src/10.2/mysys/my_malloc.c:218
          #4 0x55c18002264c in free_root /data/src/10.2/mysys/my_alloc.c:401
          #5 0x55c17e967634 in free_tmp_table(THD*, TABLE*) /data/src/10.2/sql/sql_select.cc:18186
          #6 0x55c17e94087e in JOIN::cleanup(bool) /data/src/10.2/sql/sql_select.cc:12379
          #7 0x55c17e9032e5 in JOIN::destroy() /data/src/10.2/sql/sql_select.cc:3667
          #8 0x55c17eac2547 in st_select_lex::cleanup() /data/src/10.2/sql/sql_union.cc:1579
          #9 0x55c17e9043a8 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.2/sql/sql_select.cc:3848
          #10 0x55c17e8e0c95 in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.2/sql/sql_select.cc:361
          #11 0x55c17e857b80 in execute_sqlcom_select /data/src/10.2/sql/sql_parse.cc:6248
          #12 0x55c17e844b25 in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3559
          #13 0x55c17e8b14cc in Prepared_statement::execute(String*, bool) /data/src/10.2/sql/sql_prepare.cc:5037
          #14 0x55c17e8aca98 in Prepared_statement::execute_loop(String*, bool, unsigned char*, unsigned char*) /data/src/10.2/sql/sql_prepare.cc:4466
          #15 0x55c17e8a6f6d in mysql_sql_stmt_execute(THD*) /data/src/10.2/sql/sql_prepare.cc:3574
          #16 0x55c17e844b6a in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3575
          #17 0x55c17e8610fd in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.2/sql/sql_parse.cc:7763
          #18 0x55c17e83a142 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.2/sql/sql_parse.cc:1827
          #19 0x55c17e836f01 in do_command(THD*) /data/src/10.2/sql/sql_parse.cc:1381
          #20 0x55c17ebbf430 in do_handle_one_connection(CONNECT*) /data/src/10.2/sql/sql_connect.cc:1336
          #21 0x55c17ebbecf3 in handle_one_connection /data/src/10.2/sql/sql_connect.cc:1241
          #22 0x55c17ff5b2bf in pfs_spawn_thread /data/src/10.2/storage/perfschema/pfs.cc:1869
          #23 0x7fa9a800b608 in start_thread /build/glibc-ZN95T4/glibc-2.31/nptl/pthread_create.c:477
       
      previously allocated by thread T5 here:
          #0 0x7fa9a8572bc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8)
          #1 0x55c180077e12 in sf_malloc /data/src/10.2/mysys/safemalloc.c:118
          #2 0x55c180043d77 in my_malloc /data/src/10.2/mysys/my_malloc.c:101
          #3 0x55c1800213e9 in alloc_root /data/src/10.2/mysys/my_alloc.c:243
          #4 0x55c180022e1f in memdup_root /data/src/10.2/mysys/my_alloc.c:464
          #5 0x55c17edfb7e3 in Field::make_new_field(st_mem_root*, TABLE*, bool) /data/src/10.2/sql/field.cc:2387
          #6 0x55c17e95694f in create_tmp_field_from_field(THD*, Field*, char const*, TABLE*, Item_field*) /data/src/10.2/sql/sql_select.cc:16268
          #7 0x55c17e95848d in create_tmp_field(THD*, TABLE*, Item*, Item::Type, Item***, Field**, Field**, bool, bool, bool, bool) /data/src/10.2/sql/sql_select.cc:16524
          #8 0x55c17e95b906 in create_tmp_table(THD*, TMP_TABLE_PARAM*, List<Item>&, st_order*, bool, bool, unsigned long long, unsigned long long, char const*, bool, bool) /data/src/10.2/sql/sql_select.cc:16972
          #9 0x55c17e8fc2e4 in JOIN::create_postjoin_aggr_table(st_join_table*, List<Item>*, st_order*, bool, bool, bool) /data/src/10.2/sql/sql_select.cc:2973
          #10 0x55c17e8f81d3 in JOIN::make_aggr_tables_info() /data/src/10.2/sql/sql_select.cc:2578
          #11 0x55c17e8f413b in JOIN::optimize_inner() /data/src/10.2/sql/sql_select.cc:2249
          #12 0x55c17e8e897b in JOIN::optimize() /data/src/10.2/sql/sql_select.cc:1117
          #13 0x55c17e904007 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.2/sql/sql_select.cc:3822
          #14 0x55c17e8e0c95 in handle_select(THD*, LEX*, select_result*, unsigned long) /data/src/10.2/sql/sql_select.cc:361
          #15 0x55c17e857b80 in execute_sqlcom_select /data/src/10.2/sql/sql_parse.cc:6248
          #16 0x55c17e844b25 in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3559
          #17 0x55c17e8b14cc in Prepared_statement::execute(String*, bool) /data/src/10.2/sql/sql_prepare.cc:5037
          #18 0x55c17e8aca98 in Prepared_statement::execute_loop(String*, bool, unsigned char*, unsigned char*) /data/src/10.2/sql/sql_prepare.cc:4466
          #19 0x55c17e8a6f6d in mysql_sql_stmt_execute(THD*) /data/src/10.2/sql/sql_prepare.cc:3574
          #20 0x55c17e844b6a in mysql_execute_command(THD*) /data/src/10.2/sql/sql_parse.cc:3575
          #21 0x55c17e8610fd in mysql_parse(THD*, char*, unsigned int, Parser_state*, bool, bool) /data/src/10.2/sql/sql_parse.cc:7763
          #22 0x55c17e83a142 in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool, bool) /data/src/10.2/sql/sql_parse.cc:1827
          #23 0x55c17e836f01 in do_command(THD*) /data/src/10.2/sql/sql_parse.cc:1381
          #24 0x55c17ebbf430 in do_handle_one_connection(CONNECT*) /data/src/10.2/sql/sql_connect.cc:1336
          #25 0x55c17ebbecf3 in handle_one_connection /data/src/10.2/sql/sql_connect.cc:1241
          #26 0x55c17ff5b2bf in pfs_spawn_thread /data/src/10.2/storage/perfschema/pfs.cc:1869
          #27 0x7fa9a800b608 in start_thread /build/glibc-ZN95T4/glibc-2.31/nptl/pthread_create.c:477
       
      Thread T5 created by T0 here:
          #0 0x7fa9a849f805 in pthread_create (/lib/x86_64-linux-gnu/libasan.so.5+0x3a805)
          #1 0x55c17ff5b6b0 in spawn_thread_v1 /data/src/10.2/storage/perfschema/pfs.cc:1919
          #2 0x55c17e5dc083 in inline_mysql_thread_create /data/src/10.2/include/mysql/psi/mysql_thread.h:1246
          #3 0x55c17e5f3c54 in create_thread_to_handle_connection(CONNECT*) /data/src/10.2/sql/mysqld.cc:6573
          #4 0x55c17e5f43ef in create_new_thread /data/src/10.2/sql/mysqld.cc:6643
          #5 0x55c17e5f5581 in handle_connections_sockets() /data/src/10.2/sql/mysqld.cc:6901
          #6 0x55c17e5f2fa5 in mysqld_main(int, char**) /data/src/10.2/sql/mysqld.cc:6192
          #7 0x55c17e5da93c in main /data/src/10.2/sql/main.cc:25
          #8 0x7fa9a7aea0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
       
      SUMMARY: AddressSanitizer: heap-use-after-free (/lib/x86_64-linux-gnu/libasan.so.5+0x9b47f) 
      Shadow bytes around the buggy address:
        0x0c3280008ea0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
        0x0c3280008eb0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008ec0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008ed0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008ee0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
      =>0x0c3280008ef0: fd fd fd fd fd fd fd fd[fd]fd fd fd fd fd fd fd
        0x0c3280008f00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008f10: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008f20: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
        0x0c3280008f30: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa
        0x0c3280008f40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
      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
        Freed heap region:       fd
        Stack left redzone:      f1
        Stack mid redzone:       f2
        Stack right redzone:     f3
        Stack after return:      f5
        Stack use after scope:   f8
        Global redzone:          f9
        Global init order:       f6
        Poisoned by user:        f7
        Container overflow:      fc
        Array cookie:            ac
        Intra object redzone:    bb
        ASan internal:           fe
        Left alloca redzone:     ca
        Right alloca redzone:    cb
        Shadow gap:              cc
      ==694087==ABORTING
      

      Reproducible on 10.2-10.3.
      No obvious immediate problem on a non-ASAN build, although there can be delayed ones.

      In 10.4+ the failure stopped happening after this commit:

      commit a9ca819897f5c82582bfd3fedb09c78131cf8e00
      Author: Monty
      Date:   Thu Jul 12 18:12:20 2018 +0300
       
          Call alloc() instead of realloc()
      

      Attachments

        Activity

          People

            shulga Dmitry Shulga
            elenst Elena Stepanova
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.