Commit Diff


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 <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#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)