xref: /freebsd/contrib/libedit/TEST/fuzz1.c (revision 91f764172e197c82efa97a66cfbc13d2c744b02b)
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