1 
2 #include "main_entry.h"
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6 
7 
8 #ifdef LIBFUZZER
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)9 	int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
10 		(void) fuzz_one_input(data, size);
11 		return 0;
12 	}
13 #else
14 
15 #ifndef AFL_MAX_SIZE
16 	#define AFL_MAX_SIZE 8192
17 #endif
18 
19 static uint8_t tmp_buffer[AFL_MAX_SIZE];
20 
afl_read(uint8_t ** data)21 static size_t afl_read(uint8_t **data) {
22 
23 	ssize_t size = read(0, tmp_buffer, AFL_MAX_SIZE);
24 	if (size <= 0) {
25 		return 0;
26 	}
27 	*data = (uint8_t *) malloc(size);
28 	if (NULL == *data) {
29 		return 0;
30 	}
31 	memcpy(*data, tmp_buffer, size);
32 	return size;
33 }
34 
35 #define AFL_READ_AND_EXECUTE                        \
36 	do {                                        \
37 		size = afl_read(&data);             \
38 		if (NULL == data || 0 == size) {    \
39 			return 0;                   \
40 		}                                   \
41 		ret = fuzz_one_input(data, size);   \
42 		free(data);                         \
43 	} while (0)
44 
main(void)45 int main(void) {
46 	size_t size;
47 	uint8_t *data = NULL;
48 	bool ret;
49 
50 	#ifdef __AFL_LOOP
51 	while (__AFL_LOOP(1000)) {
52 		AFL_READ_AND_EXECUTE;
53 	}
54 	return 0;
55 	#else
56 		AFL_READ_AND_EXECUTE;
57 		return ret ? 0 : -1;
58 	#endif
59 }
60 #endif
61