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 
main(int argc,char const ** argv)18 int main(int argc, char const **argv) {
19   size_t const kMaxFileSize = (size_t)1 << 27;
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      * If it is not a regular file, then it may have been deleted since we
45      * constructed the list, so just skip it.
46      */
47     if (!UTIL_isRegularFile(fileName)) {
48       continue;
49     }
50     FUZZ_ASSERT_MSG(fileSize <= kMaxFileSize, fileName);
51     /* Ensure we have a large enough buffer allocated */
52     if (fileSize > bufferSize) {
53       free(buffer);
54       buffer = (uint8_t *)malloc(fileSize);
55       FUZZ_ASSERT_MSG(buffer, fileName);
56       bufferSize = fileSize;
57     }
58     /* Open the file */
59     file = fopen(fileName, "rb");
60     FUZZ_ASSERT_MSG(file, fileName);
61     /* Read the file */
62     readSize = fread(buffer, 1, fileSize, file);
63     FUZZ_ASSERT_MSG(readSize == fileSize, fileName);
64     /* Close the file */
65     fclose(file);
66     /* Run the fuzz target */
67     LLVMFuzzerTestOneInput(buffer, fileSize);
68   }
69 
70   ret = 0;
71   free(buffer);
72 #ifdef UTIL_HAS_CREATEFILELIST
73   UTIL_freeFileList(files, fileNamesBuf);
74 #endif
75   return ret;
76 }
77