| /* |
| * build: |
| * CC=clang CXX=clang++ CFLAGS="-fsanitize=address,fuzzer-no-link -g" \ |
| * CXXFLAGS="-fsanitize=address,fuzzer-no-link -g" ./configure && make |
| * run: |
| * LD_LIBRARY_PATH=../src/.libs/ .libs/fuzz1 -max_len=32 \ |
| * -use_value_profile=1 -only_ascii=1 |
| */ |
| #include <readline/readline.h> |
| #include <locale.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| int init = 0; |
| |
| int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
| if (!Size) |
| return 0; |
| |
| if (!init) { |
| setlocale(LC_CTYPE, ""); |
| stifle_history(7); |
| init = 1; |
| } |
| |
| clear_history(); |
| |
| size_t lasti = 0; |
| |
| for (size_t i = 0;; ++i) { |
| if (i == Size || Data[i] == '\n') { |
| if (i - lasti) { |
| char *s = (char *)malloc(i - lasti + 1); |
| memcpy(s, &Data[lasti], i - lasti); |
| s[i - lasti] = '\0'; |
| |
| char *expansion; |
| int result; |
| |
| #ifdef DEBUG |
| fprintf(stderr, "Calling history_expand: >%s<\n", s); |
| #endif |
| result = history_expand(s, &expansion); |
| |
| if (result < 0 || result == 2) { |
| /* Errors ignored */ |
| } else { |
| add_history(expansion); |
| } |
| free(expansion); |
| free(s); |
| } |
| lasti = i + 1; |
| } |
| |
| if (i == Size) |
| break; |
| } |
| |
| return 0; |
| } |