commit 01059301696c508a9fe382ca12c6aec6491abe90 from: Sergey Bronnikov via: Sergey Bronnikov date: Fri Mar 21 15:35:13 2025 UTC luzer: test_goodbye LuaJIT FFI commit - b1e0b4c7e446aa963c72d8371bd0651a28da3490 commit + 01059301696c508a9fe382ca12c6aec6491abe90 blob - 9acee3187928982ad93c166fbba76dbc848baa5f blob + 1d5e15ccae9b18a52b22bd04d4e826b0fa7ab060 --- luzer/tests/CMakeLists.txt +++ luzer/tests/CMakeLists.txt @@ -119,3 +119,23 @@ set_tests_properties(luzer_lua_capi_hello PROPERTIES ENVIRONMENT "LUA_CPATH=${LUA_CPATH};LUA_PATH=${LUA_PATH}" PASS_REGULAR_EXPRESSION "Crash!" ) + +add_library(goodbye SHARED test_goodbye.c) +target_include_directories(goodbye PRIVATE ${LUA_INCLUDE_DIR}) +target_link_libraries(goodbye PRIVATE + ${FUZZER_NO_MAIN_LIBRARY} +) +target_compile_options(goodbye PRIVATE + -fsanitize=fuzzer-no-link + -fprofile-instr-generate +) + +add_test( + NAME luzer_lua_ffi_goodbye + COMMAND ${LUA_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/test_goodbye.lua" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) +set_tests_properties(luzer_lua_ffi_goodbye PROPERTIES + ENVIRONMENT "LUA_CPATH=${LUA_CPATH};LUA_PATH=${LUA_PATH}" + PASS_REGULAR_EXPRESSION "Crash!" +) blob - /dev/null blob + 2e18bb0a2f3d20d24c46da3d3d6bf66d677c3bf5 (mode 644) --- /dev/null +++ luzer/tests/test_goodbye.c @@ -0,0 +1,15 @@ +#include +#include +#include + +#define MESSAGE "Goodbye, Lua!" + +int +say_goodbye(const char *buf) { + if (strncmp(buf, MESSAGE, sizeof(MESSAGE)) == 0) { + fprintf(stderr, "Crash!\n"); + abort(); + } + + return 1; +} blob - /dev/null blob + 36bb9a42871f38af25c19e7ae034ec22e0df410d (mode 644) --- /dev/null +++ luzer/tests/test_goodbye.lua @@ -0,0 +1,30 @@ +local luzer = require("luzer") +local has_ffi, ffi = pcall(require, "ffi") +if not has_ffi then + os.exit(0) +end + +ffi.cdef[[ +int say_goodbye(const char *buf); +]] + +local function TestOneInput(buf) + local fdp = luzer.FuzzedDataProvider(buf) + local len = fdp:consume_integer(1, 100) + local str = fdp:consume_string(len) + local libgoodbye = ffi.load("./build/luzer/tests/libgoodbye.so") + libgoodbye.say_goodbye(str) +end + +local opts = { + detect_leaks = 1, + max_len = 4096, + only_ascii = 1, + print_coverage = 1, + print_full_coverage = 1, + print_pcs = 1, + use_cmp = 1, + use_value_profile = 1, + runs = 100000, +} +luzer.Fuzz(TestOneInput, nil, opts)