aboutsummaryrefslogtreecommitdiff
path: root/fuzz/text-fuzzer.c
diff options
context:
space:
mode:
Diffstat (limited to 'fuzz/text-fuzzer.c')
-rw-r--r--fuzz/text-fuzzer.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/fuzz/text-fuzzer.c b/fuzz/text-fuzzer.c
index ddb132b..c09d7be 100644
--- a/fuzz/text-fuzzer.c
+++ b/fuzz/text-fuzzer.c
@@ -1,5 +1,6 @@
#include <stddef.h>
#include <stdbool.h>
+#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
@@ -112,8 +113,7 @@ static Cmd commands[] = {
['u'] = cmd_undo,
};
-int main(int argc, char *argv[]) {
- char line[BUFSIZ], *name = (argc == 1) ? NULL : argv[1];
+static int repl(const char *name, FILE *input) {
Text *txt = text_load(name);
if (!name)
name = "-";
@@ -124,9 +124,10 @@ int main(int argc, char *argv[]) {
printf("Loaded %zu bytes from `%s'\n", text_size(txt), name);
+ char line[BUFSIZ];
for (;;) {
printf("> ");
- if (!fgets(line, sizeof(line), stdin))
+ if (!fgets(line, sizeof(line), input))
break;
if (!isatty(0))
printf("%s", line);
@@ -147,3 +148,22 @@ int main(int argc, char *argv[]) {
return 0;
}
+
+#ifdef LIBFUZZER
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t len) {
+ FILE *input = fmemopen((void*)data, len, "r");
+ if (!input)
+ return 1;
+ int r = repl(NULL, input);
+ fclose(input);
+ return r;
+}
+
+#else
+
+int main(int argc, char *argv[]) {
+ return repl(argc == 1 ? NULL : argv[1], stdin);
+}
+
+#endif /* LIBFUZZER */