1 /******************************************************************************
2  *
3  * Project:  GDAL
4  * Purpose:  Fuzzer
5  * Author:   Even Rouault, even.rouault at spatialys.com
6  *
7  ******************************************************************************
8  * Copyright (c) 2017, Even Rouault <even.rouault at spatialys.com>
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a
11  * copy of this software and associated documentation files (the "Software"),
12  * to deal in the Software without restriction, including without limitation
13  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14  * and/or sell copies of the Software, and to permit persons to whom the
15  * Software is furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included
18  * in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26  * DEALINGS IN THE SOFTWARE.
27  ****************************************************************************/
28 
29 #include <stdlib.h>
30 #include <stdio.h>
31 
32 int LLVMFuzzerTestOneInput(void *buf, size_t len);
33 int LLVMFuzzerInitialize(int* argc, char*** argv);
34 
main(int argc,char * argv[])35 int main(int argc, char* argv[])
36 {
37     LLVMFuzzerInitialize(&argc, &argv);
38     if( argc < 2 )
39     {
40         return LLVMFuzzerTestOneInput(" ", 1);
41     }
42     else
43     {
44         int nRet = 0;
45         void* buf = NULL;
46         int nLen = 0;
47         FILE* f = fopen(argv[1], "rb");
48         if( !f )
49         {
50             fprintf(stderr, "%s does not exist.\n", argv[1]);
51             exit(1);
52         }
53         fseek(f, 0, SEEK_END);
54         nLen = (int)ftell(f);
55         fseek(f, 0, SEEK_SET);
56         buf = malloc(nLen);
57         if( !buf )
58         {
59             fprintf(stderr, "malloc failed.\n");
60             fclose(f);
61             exit(1);
62         }
63         fread(buf, nLen, 1, f);
64         fclose(f);
65         nRet = LLVMFuzzerTestOneInput(buf, nLen);
66         free(buf);
67         return nRet;
68     }
69 }
70