Skip to content

Window functions: heap-use-after-free

В ходе изучения излишнего расхода резидентной памяти с @funbringer, мы поймали следующую ошибку на сборке пикодаты с асаном. Для воспроизведения нужно:

  • поставить llvm-symbolizer
  • наложить патч на тарантул модуль для obuf (у него другая структура под асаном) - obuf.patch
  • сделать шаги, описанные Георгием тут: picodata#1611 (comment 133870) (единственное, у таблицы cd_customer_account стоит уменьшить количество кортежей в 100 раз, а не грузить через timeout; остальные таблицы должны быть загружены полностью)

При этом точно установлено, что heap-use-after-free не возникает без оконок.

==901560==ERROR: AddressSanitizer: heap-use-after-free on address 0x50b00043f2b0 at pc 0x000002da115a bp 0x6ffcc97fd250 sp 0x6ffcc97fd248                                                                           
READ of size 1 at 0x50b00043f2b0 thread T0                                                                                                                                                                          
    #0 0x000002da1159 in sql_expr_coll /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:287:15                                                                                                          
    #1 0x000002db7f22 in sql_binary_compare_coll_seq /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:527:6                                                                                             
    #2 0x000002db7f22 in codeCompare /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:555:6                                                                                                             
    #3 0x000002dbbdd9 in sqlExprIfFalse /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:4860:4                                                                                                         
    #4 0x000002dbc4b7 in sqlExprIfFalse /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:4824:4                                                                                                         
    #5 0x000002db02db in sqlExprCodeTarget /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:4310:5                                                                                                      
    #6 0x000002db8756 in sqlExprCodeExprList /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:4548:8                                                                                                    
    #7 0x000002e2613c in selectInnerLoop /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/select.c:1266:7                                                                                                      
    #8 0x000002e1e36a in sqlSelect /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/select.c:6107:4                                                                                                            
    #9 0x000002d8185b in yy_reduce /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/parse.y:419:3                                                                                                              
    #10 0x000002d77d93 in sqlParser /home/picoadm/leak/picodata/target/x86_64-unknown-linux-gnu/asan-dev/build/tarantool-sys/static/tarantool-prefix/src/tarantool-build/src/box/sql/parse.c:4695:7                 
    #11 0x000002e37464 in sqlRunParser /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/tokenize.c:655:3                                                                                                       
    #12 0x000002e02323 in sql_stmt_compile /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/prepare.c:79:4                                                                                                     
    #13 0x000002d612dd in sql_stmt_find_or_create /home/picoadm/leak/picodata/tarantool-sys/src/box/execute.c:132:7                                                                                                 
    #14 0x000002d615a5 in sql_prepare_ext /home/picoadm/leak/picodata/tarantool-sys/src/box/execute.c:180:6                                                                                                         
    #15 0x00000515e303 in tarantool::ffi::sql::sql_prepare_ext::h3651b2e4671d683a /home/picoadm/leak/picodata/tarantool/tarantool/src/ffi/helper.rs:136:24                                                          
    #16 0x00000515e303 in tarantool::sql::prepare::h7270373f5badef0d /home/picoadm/leak/picodata/tarantool/tarantool/src/sql.rs:64:9                                                                                
    #17 0x000004e6ccad in sbroad::executor::engine::helpers::proxy::proxy_start::_$u7b$$u7b$closure$u7d$$u7d$::h72e8925bb2d1b9a8 /home/picoadm/leak/picodata/sbroad/sbroad-core/src/executor/engine/helpers/proxy.r$:52:57
    #18 0x0000048d87d2 in _$LT$alloc..boxed..Box$LT$F$C$A$GT$$u20$as$u20$core..ops..function..FnOnce$LT$Args$GT$$GT$::call_once::h90a0891b6e4dc9c6 /rustc/4d91de4e48198da2e33413efdcd9cd2cc0c46688/library/alloc/sr$/boxed.rs:1993:9
    #19 0x000004e316b0 in tarantool::fiber::Fyber$LT$F$C$T$GT$::trampoline_for_ffi::hd9b8cb5407a356ea /home/picoadm/leak/picodata/tarantool/tarantool/src/fiber.rs:828:17                                          
    #20 0x000002a99918 in fiber_cxx_invoke(int (*)(__va_list_tag*), __va_list_tag*) /home/picoadm/leak/picodata/tarantool-sys/src/lib/core/fiber.h:1300:10                                                         
    #21 0x0000028f8e53 in fiber_loop /home/picoadm/leak/picodata/tarantool-sys/src/lib/core/fiber.c:1160:18                                                                                                        
    #22 0x0000029e7a68 in coro_init /home/picoadm/leak/picodata/tarantool-sys/third_party/coro/coro.c:108:3                                                                                                        

0x50b00043f2b0 is located 0 bytes inside of 104-byte region [0x50b00043f2b0,0x50b00043f318)
freed by thread T0 here:
    #0 0x0000004ab536 in free /rustc/llvm/src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:52:3
    #1 0x000002e301e8 in substExpr /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/select.c:3771:5

previously allocated by thread T0 here:
    #0 0x0000004ab7cf in malloc /rustc/llvm/src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:68:3                                                                                                       
    #1 0x000002dd9049 in sql_xmalloc /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/malloc.c:83:9

SUMMARY: AddressSanitizer: heap-use-after-free /home/picoadm/leak/picodata/tarantool-sys/src/box/sql/expr.c:287:15 in sql_expr_coll                                                                                
Shadow bytes around the buggy address:
  0x50b00043f000: fd fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa
  0x50b00043f080: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fd fd
  0x50b00043f100: fd fa fa fa fa fa fa fa fa fa fd fd fd fd fd fd
  0x50b00043f180: fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa fa
  0x50b00043f200: fd fd fd fd fd fd fd fd fd fd fd fd fd fa fa fa
=>0x50b00043f280: fa fa fa fa fa fa[fd]fd fd fd fd fd fd fd fd fd
  0x50b00043f300: fd fd fd fa fa fa fa fa fa fa fa fa fd fd fd fd
  0x50b00043f380: fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa
  0x50b00043f400: fa fa fd fd fd fd fd fd fd fd fd fd fd fd fd fa
  0x50b00043f480: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x50b00043f500: fd fd fd fd fd fa fa fa fa fa fa fa fa fa 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
  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
==901560==ABORTING
Aborted

Ref picodata#1611 (closed) (изначальная отправная точка, из которой пришло репро)

Edited by Dmitry Ivanov