1 /*
2 * build:
3 * CC=clang CXX=clang++ CFLAGS="-fsanitize=address,fuzzer-no-link -g" \
4 * CXXFLAGS="-fsanitize=address,fuzzer-no-link -g" ./configure && make
5 * run:
6 * LD_LIBRARY_PATH=../src/.libs/ .libs/fuzz1 -max_len=32 \
7 * -use_value_profile=1 -only_ascii=1
8 */
9 #include <readline/readline.h>
10 #include <locale.h>
11 #include <stdint.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15
16 int init = 0;
17
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)18 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
19 if (!Size)
20 return 0;
21
22 if (!init) {
23 setlocale(LC_CTYPE, "");
24 stifle_history(7);
25 init = 1;
26 }
27
28 clear_history();
29
30 size_t lasti = 0;
31
32 for (size_t i = 0;; ++i) {
33 if (i == Size || Data[i] == '\n') {
34 if (i - lasti) {
35 char *s = (char *)malloc(i - lasti + 1);
36 memcpy(s, &Data[lasti], i - lasti);
37 s[i - lasti] = '\0';
38
39 char *expansion;
40 int result;
41
42 #ifdef DEBUG
43 fprintf(stderr, "Calling history_expand: >%s<\n", s);
44 #endif
45 result = history_expand(s, &expansion);
46
47 if (result < 0 || result == 2) {
48 /* Errors ignored */
49 } else {
50 add_history(expansion);
51 }
52 free(expansion);
53 free(s);
54 }
55 lasti = i + 1;
56 }
57
58 if (i == Size)
59 break;
60 }
61
62 return 0;
63 }
64