1/* 2 * Copyright (c) 2016-present, Facebook, Inc. 3 * All rights reserved. 4 * 5 * This source code is licensed under both the BSD-style license (found in the 6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7 * in the COPYING file in the root directory of this source tree). 8 */ 9 10#include "fuzz.h" 11#include "fuzz_helpers.h" 12#include "util.h" 13#include <stddef.h> 14#include <stdint.h> 15#include <stdio.h> 16#include <stdlib.h> 17 18int main(int argc, char const **argv) { 19 size_t const kMaxFileSize = (size_t)1 << 20; 20 int const kFollowLinks = 1; 21 char *fileNamesBuf = NULL; 22 char const **files = argv + 1; 23 unsigned numFiles = argc - 1; 24 uint8_t *buffer = NULL; 25 size_t bufferSize = 0; 26 unsigned i; 27 int ret; 28 29#ifdef UTIL_HAS_CREATEFILELIST 30 files = UTIL_createFileList(files, numFiles, &fileNamesBuf, &numFiles, 31 kFollowLinks); 32 if (!files) 33 numFiles = 0; 34#endif 35 if (numFiles == 0) 36 fprintf(stderr, "WARNING: No files passed to %s\n", argv[0]); 37 for (i = 0; i < numFiles; ++i) { 38 char const *fileName = files[i]; 39 size_t const fileSize = UTIL_getFileSize(fileName); 40 size_t readSize; 41 FILE *file; 42 43 /* Check that it is a regular file, and that the fileSize is valid */ 44 FUZZ_ASSERT_MSG(UTIL_isRegularFile(fileName), fileName); 45 FUZZ_ASSERT_MSG(fileSize <= kMaxFileSize, fileName); 46 /* Ensure we have a large enough buffer allocated */ 47 if (fileSize > bufferSize) { 48 free(buffer); 49 buffer = (uint8_t *)malloc(fileSize); 50 FUZZ_ASSERT_MSG(buffer, fileName); 51 bufferSize = fileSize; 52 } 53 /* Open the file */ 54 file = fopen(fileName, "rb"); 55 FUZZ_ASSERT_MSG(file, fileName); 56 /* Read the file */ 57 readSize = fread(buffer, 1, fileSize, file); 58 FUZZ_ASSERT_MSG(readSize == fileSize, fileName); 59 /* Close the file */ 60 fclose(file); 61 /* Run the fuzz target */ 62 LLVMFuzzerTestOneInput(buffer, fileSize); 63 } 64 65 ret = 0; 66 free(buffer); 67#ifdef UTIL_HAS_CREATEFILELIST 68 UTIL_freeFileList(files, fileNamesBuf); 69#endif 70 return ret; 71} 72