Commit Diff
- Commit:
16d11f88099b05c375ce3c45f0ff7ca2c8ded772
- From:
- Sergey Bronnikov <sergeyb@tarantool.org>
- Date:
- Message:
- varbinary: fix UB in a varbinary.new() With enabled UndefinedBehavior Sanitizer runtime error like below is triggered: NO_WRAP $ UBSAN_OPTIONS=external_symbolizer_path=/usr/lib/llvm-13/bin/llvm-symbolizer:print_stacktrace=1 $ ./build/src/tarantool -e "require('varbinary').new()" /home/sergeyb/sources/MRG/tarantool/third_party/luajit/src/lib_ffi.c:710:14: \ runtime error: null pointer passed as argument 2, which is declared to never be null /usr/include/string.h:44:28: note: nonnull attribute specified here NO_WRAP This happened because in the varbinary constructor, the NULL pointer was passed to `ffi.copy()` and then to `memcpy()`, which is an undefined behaviour. The patch fixes that. Needed for #10145 NO_CHANGELOG=codehealth NO_DOC=codehealth NO_TEST=codehealth (cherry picked from commit 30179d44da65f835d81494ad63e86935f1c5aad0)
- Actions:
- Patch | Tree
--- src/lua/varbinary.lua +++ src/lua/varbinary.lua @@ -24,7 +24,9 @@ local function new_varbinary(data, size) error('Usage: varbinary.new(str) or varbinary.new(ptr, size)', 2) end local bin = ffi.new(varbinary_t, size) - ffi.copy(bin, data, size) + if size ~= 0 then + ffi.copy(bin, data, size) + end return bin end