diff options
author | Joseph Bisch <joseph.bisch@gmail.com> | 2017-01-07 20:01:07 -0500 |
---|---|---|
committer | Joseph Bisch <joseph.bisch@gmail.com> | 2017-01-07 20:01:07 -0500 |
commit | cf4690725667211bc8a8998e362c6bda24dd7528 (patch) | |
tree | ecd89755df29366a40806865a7910954a5b49e9f /src/fe-fuzz | |
parent | 7c09b72a26884bcd9711f39e2730ab09e658eec1 (diff) | |
download | irssi-cf4690725667211bc8a8998e362c6bda24dd7528.zip |
Add frontend for fuzzing
Use the following configure command:
$ ./configure --with-fuzzer --with-fuzzer-lib=/path/to/libFuzzer.a \
CC=clang CXX=clang++
Places an irssi-fuzz in src/fe-fuzz/ after build.
Also can specify SANFLAGS to override the chosen sanitizer flags
(defaults to "-g -fsanitize=address -fsanitize-coverage=trace-pc-guard").
Diffstat (limited to 'src/fe-fuzz')
-rw-r--r-- | src/fe-fuzz/Makefile.am | 25 | ||||
-rw-r--r-- | src/fe-fuzz/irssi.c | 58 | ||||
-rw-r--r-- | src/fe-fuzz/module-formats.c | 82 | ||||
-rw-r--r-- | src/fe-fuzz/module-formats.h | 58 | ||||
-rw-r--r-- | src/fe-fuzz/tokens.txt | 143 |
5 files changed, 366 insertions, 0 deletions
diff --git a/src/fe-fuzz/Makefile.am b/src/fe-fuzz/Makefile.am new file mode 100644 index 00000000..2ecf4a85 --- /dev/null +++ b/src/fe-fuzz/Makefile.am @@ -0,0 +1,25 @@ +bin_PROGRAMS = irssi-fuzz + +# Force link with clang++ for libfuzzer support +CCLD=clang++ $(CXXFLAGS) + +AM_CPPFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/core/ \ + -I$(top_srcdir)/src/irc/core/ \ + -I$(top_srcdir)/src/fe-common/core/ \ + $(GLIB_CFLAGS) + +irssi_fuzz_DEPENDENCIES = @COMMON_LIBS@ + +irssi_fuzz_LDADD = \ + @COMMON_LIBS@ \ + @PROG_LIBS@ \ + $(FUZZER_LIBS) + +irssi_fuzz_SOURCES = \ + irssi.c \ + module-formats.c + +noinst_HEADERS = \ + module-formats.h diff --git a/src/fe-fuzz/irssi.c b/src/fe-fuzz/irssi.c new file mode 100644 index 00000000..3b2c617a --- /dev/null +++ b/src/fe-fuzz/irssi.c @@ -0,0 +1,58 @@ +/* + irssi.c : irssi + + Copyright (C) 2017 Joseph Bisch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "module.h" +#include "modules-load.h" +#include "levels.h" +#include "module-formats.h" +#include "themes.h" +#include "core.h" +#include "fe-common-core.h" +#include "args.h" +#include "printtext.h" + +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + core_register_options(); + fe_common_core_register_options(); + /* no args */ + args_execute(0, NULL); + core_preinit((*argv)[0]); + core_init(); + fe_common_core_init(); + theme_register(gui_text_formats); + module_register("core", "fe-fuzz"); + printtext_string(NULL, NULL, MSGLEVEL_CLIENTCRAP, "init"); + return 0; +} + +int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + char *copy = (char *)malloc(sizeof(char)*(size+1)); + memcpy(copy, data, size); + copy[size] = '\0'; + printtext_string(NULL, NULL, MSGLEVEL_CLIENTCRAP, copy); + free(copy); + return 0; +} diff --git a/src/fe-fuzz/module-formats.c b/src/fe-fuzz/module-formats.c new file mode 100644 index 00000000..899827c2 --- /dev/null +++ b/src/fe-fuzz/module-formats.c @@ -0,0 +1,82 @@ +/* + module-formats.c : irssi + + Copyright (C) 2000 Timo Sirainen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "module.h" +#include "formats.h" + +FORMAT_REC gui_text_formats[] = +{ + { MODULE_NAME, "Text user interface", 0 }, + + /* ---- */ + { NULL, "Lastlog", 0 }, + + { "lastlog_too_long", "/LASTLOG would print $0 lines. If you really want to print all these lines use -force option.", 1, { 1 } }, + { "lastlog_count", "{hilight Lastlog}: $0 lines", 1, { 1 } }, + { "lastlog_start", "{hilight Lastlog}:", 0 }, + { "lastlog_end", "{hilight End of Lastlog}", 0 }, + { "lastlog_separator", "--", 0 }, + { "lastlog_date", "%%F ", 0 }, + + /* ---- */ + { NULL, "Windows", 0 }, + + { "refnum_not_found", "Window number $0 not found", 1, { 0 } }, + { "window_too_small", "Not enough room to resize this window", 0 }, + { "cant_hide_last", "You can't hide the last window", 0 }, + { "cant_hide_sticky_windows", "You can't hide sticky windows (use /WINDOW STICK OFF)", 0 }, + { "cant_show_sticky_windows", "You can't show sticky windows (use /WINDOW STICK OFF)", 0 }, + { "window_not_sticky", "Window is not sticky", 0 }, + { "window_set_sticky", "Window set sticky", 0 }, + { "window_unset_sticky", "Window is not sticky anymore", 0 }, + { "window_info_sticky", "%#Sticky : $0", 1, { 0 } }, + { "window_info_scroll", "%#Scroll : $0", 1, { 0 } }, + { "window_scroll", "Window scroll mode is now $0", 1, { 0 } }, + { "window_scroll_unknown", "Unknown scroll mode $0, must be ON, OFF or DEFAULT", 1, { 0 } }, + + /* ---- */ + { NULL, "Statusbars", 0 }, + + { "statusbar_list_header", "%#Name Type Placement Position Visible", 0 }, + { "statusbar_list_footer", "", 0 }, + { "statusbar_list", "%#$[30]0 $[6]1 $[9]2 $[8]3 $4", 5, { 0, 0, 0, 1, 0 } }, + { "statusbar_info_name", "%#Statusbar: {hilight $0}", 1, { 0 } }, + { "statusbar_info_type", "%#Type : $0", 1, { 0 } }, + { "statusbar_info_placement", "%#Placement: $0", 1, { 0 } }, + { "statusbar_info_position", "%#Position : $0", 1, { 1 } }, + { "statusbar_info_visible", "%#Visible : $0", 1, { 0 } }, + { "statusbar_info_item_header", "%#Items : Name Priority Alignment", 0 }, + { "statusbar_info_item_footer", "", 0 }, + { "statusbar_info_item_name", "%# : $[35]0 $[9]1 $2", 3, { 0, 1, 0 } }, + { "statusbar_not_found", "Statusbar doesn't exist: $0", 1, { 0 } }, + { "statusbar_item_not_found", "Statusbar item doesn't exist: $0", 1, { 0 } }, + { "statusbar_unknown_command", "Unknown statusbar command: $0", 1, { 0 } }, + { "statusbar_unknown_type", "Statusbar type must be 'window' or 'root'", 1, { 0 } }, + { "statusbar_unknown_placement", "Statusbar placement must be 'top' or 'bottom'", 1, { 0 } }, + { "statusbar_unknown_visibility", "Statusbar visibility must be 'always', 'active' or 'inactive'", 1, { 0 } }, + + /* ---- */ + { NULL, "Pasting", 0 }, + + { "paste_warning", "Pasting $0 lines to $1. Press Ctrl-K if you wish to do this or Ctrl-C to cancel.", 2, { 1, 0 } }, + { "paste_prompt", "Hit Ctrl-K to paste, Ctrl-C to abort?", 0 }, + + { NULL, NULL, 0 } +}; diff --git a/src/fe-fuzz/module-formats.h b/src/fe-fuzz/module-formats.h new file mode 100644 index 00000000..3fa8c511 --- /dev/null +++ b/src/fe-fuzz/module-formats.h @@ -0,0 +1,58 @@ +#include "formats.h" + +enum { + TXT_MODULE_NAME, + + TXT_FILL_1, + + TXT_LASTLOG_TOO_LONG, + TXT_LASTLOG_COUNT, + TXT_LASTLOG_START, + TXT_LASTLOG_END, + TXT_LASTLOG_SEPARATOR, + TXT_LASTLOG_DATE, + + TXT_FILL_2, + + TXT_REFNUM_NOT_FOUND, + TXT_WINDOW_TOO_SMALL, + TXT_CANT_HIDE_LAST, + TXT_CANT_HIDE_STICKY_WINDOWS, + TXT_CANT_SHOW_STICKY_WINDOWS, + TXT_WINDOW_NOT_STICKY, + TXT_WINDOW_SET_STICKY, + TXT_WINDOW_UNSET_STICKY, + TXT_WINDOW_INFO_STICKY, + TXT_WINDOW_INFO_SCROLL, + TXT_WINDOW_SCROLL, + TXT_WINDOW_SCROLL_UNKNOWN, + + TXT_FILL_3, + + TXT_STATUSBAR_LIST_HEADER, + TXT_STATUSBAR_LIST_FOOTER, + TXT_STATUSBAR_LIST, + TXT_STATUSBAR_INFO_NAME, + TXT_STATUSBAR_INFO_TYPE, + TXT_STATUSBAR_INFO_PLACEMENT, + TXT_STATUSBAR_INFO_POSITION, + TXT_STATUSBAR_INFO_VISIBLE, + TXT_STATUSBAR_INFO_ITEM_HEADER, + TXT_STATUSBAR_INFO_ITEM_FOOTER, + TXT_STATUSBAR_INFO_ITEM_NAME, + TXT_STATUSBAR_NOT_FOUND, + TXT_STATUSBAR_ITEM_NOT_FOUND, + TXT_STATUSBAR_UNKNOWN_COMMAND, + TXT_STATUSBAR_UNKNOWN_TYPE, + TXT_STATUSBAR_UNKNOWN_PLACEMENT, + TXT_STATUSBAR_UNKNOWN_VISIBILITY, + + TXT_FILL_4, + + TXT_PASTE_WARNING, + TXT_PASTE_PROMPT, + + TXT_COUNT +}; + +extern FORMAT_REC gui_text_formats[TXT_COUNT+1]; diff --git a/src/fe-fuzz/tokens.txt b/src/fe-fuzz/tokens.txt new file mode 100644 index 00000000..e337b6e9 --- /dev/null +++ b/src/fe-fuzz/tokens.txt @@ -0,0 +1,143 @@ +"@%+" +"*@*!*" +"001" +"002" +"003" +"004" +"005" +"221" +"254" +"271" +"272" +"281" +"301" +"302" +"303" +"305" +"306" +"311" +"312" +"313" +"314" +"315" +"317" +"318" +"319" +"324" +"326" +"327" +"328" +"329" +"330" +"332" +"333" +"338" +"341" +"344" +"345" +"346" +"347" +"348" +"349" +"352" +"353" +"364" +"365" +"366" +"367" +"368" +"369" +"372" +"375" +"376" +"377" +"378" +"379" +"381" +"386" +"387" +"388" +"389" +"396" +"401" +"403" +"404" +"405" +"407" +"408" +"410" +"421" +"422" +"433" +"436" +"437" +"438" +"439" +"442" +"465" +"470" +"471" +"472" +"473" +"474" +"475" +"476" +"477" +"478" +"479" +"482" +"486" +"489" +"494" +"506" +"707" +"716" +"717" +"728" +"729" +"902" +"903" +"904" +"905" +"906" +"907" +":a" +"+a" +"ACK" +"authenticate" +"away" +"-b" +"+b" +"cap" +"#chan" +"connected" +"empty" +"error" +"invite" +"join" +"kick" +"kill" +"LS" +"mode" +"multi-prefix" +"NAK" +"network" +"nick" +"nicklen" +"notice" +"-o" +"+o" +"part" +"ping" +"pong" +"prefix" +"privmsg" +"quit" +"sasl" +"topic" +"wallops" +"watch" +":\x01" +":\x01ACTION" +":\x01PING" +":\x01VERSION" |