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