/** * Copyright (c) 2016-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #include "fuzz.h" #include "fuzz_helpers.h" #include "util.h" #include #include #include #include int main(int argc, char const **argv) { size_t const kMaxFileSize = (size_t)1 << 20; int const kFollowLinks = 1; char *fileNamesBuf = NULL; char const **files = argv + 1; unsigned numFiles = argc - 1; uint8_t *buffer = NULL; size_t bufferSize = 0; unsigned i; int ret; #ifdef UTIL_HAS_CREATEFILELIST files = UTIL_createFileList(files, numFiles, &fileNamesBuf, &numFiles, kFollowLinks); FUZZ_ASSERT(files); #endif for (i = 0; i < numFiles; ++i) { char const *fileName = files[i]; size_t const fileSize = UTIL_getFileSize(fileName); size_t readSize; FILE *file; /* Check that it is a regular file, and that the fileSize is valid */ FUZZ_ASSERT_MSG(UTIL_isRegFile(fileName), fileName); FUZZ_ASSERT_MSG(fileSize <= kMaxFileSize, fileName); /* Ensure we have a large enough buffer allocated */ if (fileSize > bufferSize) { free(buffer); buffer = (uint8_t *)malloc(fileSize); FUZZ_ASSERT_MSG(buffer, fileName); bufferSize = fileSize; } /* Open the file */ file = fopen(fileName, "rb"); FUZZ_ASSERT_MSG(file, fileName); /* Read the file */ readSize = fread(buffer, 1, fileSize, file); FUZZ_ASSERT_MSG(readSize == fileSize, fileName); /* Close the file */ fclose(file); /* Run the fuzz target */ LLVMFuzzerTestOneInput(buffer, fileSize); } ret = 0; free(buffer); #ifdef UTIL_HAS_CREATEFILELIST UTIL_freeFileList(files, fileNamesBuf); #endif return ret; }