1 /**
2  * License: MIT
3  */
4 module ossfuzz.standaloneengine;
5 
6 
7 private static import core.memory;
8 private static import core.stdc.stdio;
9 private static import ossfuzz.json_load_dump_fuzzer;
10 private static import std.string;
11 
12 /**
13  * Main procedure for standalone fuzzing engine.
14  *
15  * Reads filenames from the argument array. For each filename, read the file
16  * into memory and then call the fuzzing interface with the data.
17  */
18 void main(string[] argv)
19 
20 	do
21 	{
22 		for (size_t ii = 1; ii < argv.length; ii++) {
23 			core.stdc.stdio.printf("[%s] ", std..string.toStringz(argv[ii]));
24 
25 			/* Try and open the file. */
26 			core.stdc.stdio.FILE* infile = core.stdc.stdio.fopen(std..string.toStringz(argv[ii]), "rb");
27 
28 			if (infile != null) {
29 				ubyte* buffer = null;
30 
31 				core.stdc.stdio.printf("Opened.. ");
32 
33 				/* Get the length of the file. */
34 				core.stdc.stdio.fseek(infile, 0L, core.stdc.stdio.SEEK_END);
35 				size_t buffer_len = core.stdc.stdio.ftell(infile);
36 
37 				/* Reset the file indicator to the beginning of the file. */
38 				core.stdc.stdio.fseek(infile, 0L, core.stdc.stdio.SEEK_SET);
39 
40 				/* Allocate a buffer for the file contents. */
41 				buffer = cast(ubyte*)(core.memory.pureCalloc(buffer_len, ubyte.sizeof));
42 
43 				if (buffer != null) {
44 					/* Read all the text from the file into the buffer. */
45 					core.stdc.stdio.fread(buffer, ubyte.sizeof, buffer_len, infile);
46 					core.stdc.stdio.printf("Read %zu bytes, fuzzing.. ", buffer_len);
47 
48 					/* Call the fuzzer with the data. */
49 					ossfuzz.json_load_dump_fuzzer.LLVMFuzzerTestOneInput(buffer, buffer_len);
50 
51 					core.stdc.stdio.printf("complete !!");
52 
53 					/* Free the buffer as it's no longer needed. */
54 					core.memory.pureFree(buffer);
55 				} else {
56 					core.stdc.stdio.fprintf(core.stdc.stdio.stderr, "[%s] Failed to allocate %zu bytes \n", std..string.toStringz(argv[ii]), buffer_len);
57 				}
58 
59 				/* Close the file as it's no longer needed. */
60 				core.stdc.stdio.fclose(infile);
61 				infile = null;
62 			} else {
63 				/* Failed to open the file. Maybe wrong name or wrong permissions? */
64 				core.stdc.stdio.fprintf(core.stdc.stdio.stderr, "[%s] Open failed. \n", std..string.toStringz(argv[ii]));
65 			}
66 
67 			core.stdc.stdio.printf("\n");
68 		}
69 	}