blob: 897e69a351aa8a495bee6f05deab8d265632291c [file] [log] [blame] [edit]
/*
* Copyright (c) 2024 The Khronos Group Inc.
* Copyright (c) 2024 Valve Corporation
* Copyright (c) 2024 LunarG, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and/or associated documentation files (the "Materials"), to
* deal in the Materials without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Materials, and to permit persons to whom the Materials are
* furnished to do so, subject to the following conditions:
*
* The above copyright notice(s) and this permission notice shall be included in
* all copies or substantial portions of the Materials.
*
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
*
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
* USE OR OTHER DEALINGS IN THE MATERIALS.
*
* Author: Charles Giessen <charles@lunarg.com>
*/
#include "test_environment.h"
void execute_instance_enumerate_fuzzer(std::filesystem::path const& filename) {
FrameworkEnvironment env{};
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::implicit_layer, ManifestLocation::implicit_layer, "complex_layer.json");
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::settings, ManifestLocation::settings_location, "vk_loader_settings.json");
uint32_t pPropertyCount;
VkExtensionProperties pProperties = {0};
env.vulkan_functions.vkEnumerateInstanceExtensionProperties("test_auto", &pPropertyCount, &pProperties);
}
void execute_instance_create_fuzzer(std::filesystem::path const& filename) {
FrameworkEnvironment env{};
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::implicit_layer, ManifestLocation::implicit_layer, "complex_layer.json");
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::settings, ManifestLocation::settings_location, "vk_loader_settings.json");
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::icd, ManifestLocation::driver, "icd_test.json");
VkInstance inst = {0};
const char* instance_layers[] = {"VK_LAYER_KHRONOS_validation", "VK_LAYER_test_layer_1", "VK_LAYER_test_layer_2"};
VkApplicationInfo app{};
app.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app.pNext = NULL;
app.pApplicationName = "TEST_APP";
app.applicationVersion = 0;
app.pEngineName = "TEST_ENGINE";
app.engineVersion = 0;
app.apiVersion = VK_API_VERSION_1_0;
VkInstanceCreateInfo inst_info{};
inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
inst_info.pNext = NULL;
inst_info.pApplicationInfo = &app;
inst_info.enabledLayerCount = 1;
inst_info.ppEnabledLayerNames = (const char* const*)instance_layers;
inst_info.enabledExtensionCount = 0;
inst_info.ppEnabledExtensionNames = NULL;
VkResult err = env.vulkan_functions.vkCreateInstance(&inst_info, NULL, &inst);
if (err != VK_SUCCESS) {
return;
}
env.vulkan_functions.vkDestroyInstance(inst, NULL);
}
void execute_json_load_fuzzer(std::filesystem::path const& filename) {
FrameworkEnvironment env{};
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::explicit_layer, ManifestLocation::explicit_layer, "complex_layer.json");
uint32_t count = 0;
env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr);
}
void execute_setting_fuzzer(std::filesystem::path const& filename) {
FrameworkEnvironment env{};
env.write_file_from_source((std::filesystem::path(CLUSTERFUZZ_TESTCASE_DIRECTORY) / filename).string().c_str(),
ManifestCategory::settings, ManifestLocation::settings_location, "vk_loader_settings.json");
uint32_t version = 0;
env.vulkan_functions.vkEnumerateInstanceVersion(&version);
}
TEST(BadJsonInput, ClusterFuzzTestCase_5599244505186304) {
// Doesn't crash with ASAN or UBSAN
// Doesn't reproducibly crash - instance_create_fuzzer: Abrt in loader_cJSON_Delete
execute_instance_create_fuzzer("clusterfuzz-testcase-instance_create_fuzzer-5599244505186304");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5126563864051712) {
// Doesn't crash with ASAN or UBSAN
// Doesn't reproducibly crash - instance_enumerate_fuzzer: Abrt in loader_cJSON_Delete
execute_instance_enumerate_fuzzer("clusterfuzz-testcase-instance_enumerate_fuzzer-5126563864051712");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6308459683315712) {
// Doesn't crash with ASAN or UBSAN
// Doesn't reproducibly crash - instance_enumerate_fuzzer: Null-dereference READ in
// combine_settings_layers_with_regular_layers
execute_instance_enumerate_fuzzer("clusterfuzz-testcase-instance_enumerate_fuzzer-6308459683315712");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6583684169269248) {
// Crashes ASAN
// Nullptr dereference in loader_copy_to_new_str
execute_instance_enumerate_fuzzer("clusterfuzz-testcase-minimized-instance_enumerate_fuzzer-6583684169269248");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5258042868105216) {
// Doesn't crash with ASAN or UBSAN
// Doesn't reproducibly crash - json_load_fuzzer: Abrt in loader_cJSON_Delete
execute_json_load_fuzzer("clusterfuzz-testcase-json_load_fuzzer-5258042868105216");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5487817455960064) {
// Doesn't crash with ASAN or UBSAN
// Doesn't reproducibly crash - json_load_fuzzer: Abrt in std::__Fuzzer::vector<std::__Fuzzer::pair<unsigned int, unsigned
// short>, std::__
execute_json_load_fuzzer("clusterfuzz-testcase-json_load_fuzzer-5487817455960064");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4558978302214144) {
// Does crash with UBSAN and ASAN
// loader.c:287: VkResult loader_copy_to_new_str(const struct loader_instance *, const char *, char **): Assertion
// `source_str
// && dest_str' failed.
// instance_create_fuzzer: Null-dereference READ in loader_copy_to_new_str
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-4558978302214144");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4568454561071104) {
// Does crash with UBSAN and ASAN
// Causes hangs - instance_create_fuzzer: Timeout in instance_create_fuzzer
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-4568454561071104");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4820577276723200) {
// Does crash with UBSAN and ASAN
// instance_create_fuzzer: Crash in printf_common
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-4820577276723200");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5177827962454016) {
// Does crash with UBSAN and ASAN
// free(): invalid next size (fast)
// instance_create_fuzzer: Abrt in instance_create_fuzzer
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-5177827962454016");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5198773675425792) {
// Does crash with UBSAN and ASAN
// stack-overflow
// instance_create_fuzzer: Stack-overflow with empty stacktrace
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-5198773675425792");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5416197367070720) {
// Does crash with UBSAN and ASAN
// free(): invalid next size (fast)
// instance_create_fuzzer: Overwrites-const-input in instance_create_fuzzer
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-5416197367070720");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5494771615137792) {
// Does crash with UBSAN and ASAN
// stack-overflow
// instance_create_fuzzer: Stack-overflow in verify_meta_layer_component_layers
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-5494771615137792");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5801855065915392) {
// Does crash with ASAN
// Doesn't crash with UBSAN
// Causes a leak - instance_create_fuzzer: Direct-leak in print_string_ptr
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-5801855065915392");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6353004288081920) {
// Does crash with ASAN and UBSAN
// Stack overflow due to recursive meta layers
execute_instance_create_fuzzer("clusterfuzz-testcase-minimized-instance_create_fuzzer-6353004288081920");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6465902356791296) {
// Does crash with UBSAN
// Doesn't crash with ASAN
// Causes an integer overflow - instance_enumerate_fuzzer: Integer-overflow in parse_value
execute_instance_enumerate_fuzzer("clusterfuzz-testcase-minimized-instance_enumerate_fuzzer-6465902356791296");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4512865114259456) {
// Does crash with UBSAN and ASAN
// malloc(): invalid size (unsorted)
// json_load_fuzzer: Heap-buffer-overflow in parse_string
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-4512865114259456");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4552015310880768) {
// Does crash with UBSAN
// Doesn't crash with ASAN
// Causes an integer overflow
// json_load_fuzzer: Integer-overflow in parse_value
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-4552015310880768");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5208693600747520) {
// Does crash with UBSAN and ASAN
// Stack overflow
// json_load_fuzzer: Stack-overflow in print_value
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-5208693600747520");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5347670374612992) {
// Doesn't crash with ASAN or UBSAN
// No reported leaks in head, crashes in 1.3.269 & 1.3.250
// Causes a leak - json_load_fuzzer: Direct-leak in parse_array
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-5347670374612992");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5392928643547136) {
// Does crash with UBSAN and ASAN
// free(): corrupted unsorted chunks
// json_load_fuzzer: Abrt in std::__Fuzzer::basic_filebuf<char, std::__Fuzzer::char_traits<char>>::~basic_fil
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-5392928643547136");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5636386303049728) {
// Does crash with UBSAN and ASAN
// terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
// json_load_fuzzer: Abrt in json_load_fuzzer
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-5636386303049728");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6182254813249536) {
// Doesn't crash with ASAN or UBSAN
// No leaks reported in main, 1.3.269, nor 1.3.250
// Causes a leak - json_load_fuzzer: Indirect-leak in parse_object
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-6182254813249536");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6265355951996928) {
// Does crash with UBSAN and ASAN
// json_load_fuzzer: Null-dereference READ in json_load_fuzzer
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-6265355951996928");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6363106126659584) {
// Does crash with UBSAN and ASAN
// json_load_fuzzer: Overwrites-const-input in json_load_fuzzer
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-6363106126659584");
}
TEST(BadJsonInput, ClusterFuzzTestCase_6482033715838976) {
// Does crash with UBSAN and ASAN
// json_load_fuzzer: Stack-overflow in parse_array
execute_json_load_fuzzer("clusterfuzz-testcase-minimized-json_load_fuzzer-6482033715838976");
}
TEST(BadJsonInput, ClusterFuzzTestCase_4857714377818112) {
// Does crash with UBSAN and ASAN
// settings_fuzzer: Abrt in settings_fuzzer
execute_setting_fuzzer("clusterfuzz-testcase-minimized-settings_fuzzer-4857714377818112");
}
TEST(BadJsonInput, ClusterFuzzTestCase_5123849246867456) {
// Doesn't crash with ASAN or UBSAN
// No leaks reported in main, 1.3.269, nor 1.3.250
// Causes a leak - settings_fuzzer: Direct-leak in loader_append_layer_property
execute_setting_fuzzer("clusterfuzz-testcase-minimized-settings_fuzzer-5123849246867456");
}