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 (изначальная отправная точка, из которой пришло репро)