1 #include <stddef.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 
5 #include "putty.h"
6 #include "dialog.h"
7 #include "terminal.h"
8 
9 /* For Unix in particular, but harmless if this main() is reused elsewhere */
10 const bool buildinfo_gtk_relevant = false;
11 
12 static const TermWinVtable fuzz_termwin_vt;
13 
main(int argc,char ** argv)14 int main(int argc, char **argv)
15 {
16         char blk[512];
17         size_t len;
18         Terminal *term;
19         Conf *conf;
20         struct unicode_data ucsdata;
21         TermWin termwin;
22 
23         termwin.vt = &fuzz_termwin_vt;
24 
25         conf = conf_new();
26         do_defaults(NULL, conf);
27         init_ucs(&ucsdata, conf_get_str(conf, CONF_line_codepage),
28                  conf_get_bool(conf, CONF_utf8_override),
29                  CS_NONE, conf_get_int(conf, CONF_vtmode));
30 
31         term = term_init(conf, &ucsdata, &termwin);
32         term_size(term, 24, 80, 10000);
33         term->ldisc = NULL;
34         /* Tell american fuzzy lop that this is a good place to fork. */
35 #ifdef __AFL_HAVE_MANUAL_CONTROL
36         __AFL_INIT();
37 #endif
38         while (!feof(stdin)) {
39                 len = fread(blk, 1, sizeof(blk), stdin);
40                 term_data(term, false, blk, len);
41         }
42         term_update(term);
43         return 0;
44 }
45 
46 /* functions required by terminal.c */
fuzz_setup_draw_ctx(TermWin * tw)47 static bool fuzz_setup_draw_ctx(TermWin *tw) { return true; }
fuzz_draw_text(TermWin * tw,int x,int y,wchar_t * text,int len,unsigned long attr,int lattr,truecolour tc)48 static void fuzz_draw_text(
49     TermWin *tw, int x, int y, wchar_t *text, int len,
50     unsigned long attr, int lattr, truecolour tc)
51 {
52     int i;
53 
54     printf("TEXT[attr=%08lx,lattr=%02x]@(%d,%d):", attr, lattr, x, y);
55     for (i = 0; i < len; i++) {
56         printf(" %x", (unsigned)text[i]);
57     }
58     printf("\n");
59 }
fuzz_draw_cursor(TermWin * tw,int x,int y,wchar_t * text,int len,unsigned long attr,int lattr,truecolour tc)60 static void fuzz_draw_cursor(
61     TermWin *tw, int x, int y, wchar_t *text, int len,
62     unsigned long attr, int lattr, truecolour tc)
63 {
64     int i;
65 
66     printf("CURS[attr=%08lx,lattr=%02x]@(%d,%d):", attr, lattr, x, y);
67     for (i = 0; i < len; i++) {
68         printf(" %x", (unsigned)text[i]);
69     }
70     printf("\n");
71 }
fuzz_draw_trust_sigil(TermWin * tw,int x,int y)72 static void fuzz_draw_trust_sigil(TermWin *tw, int x, int y)
73 {
74     printf("TRUST@(%d,%d)\n", x, y);
75 }
fuzz_char_width(TermWin * tw,int uc)76 static int fuzz_char_width(TermWin *tw, int uc) { return 1; }
fuzz_free_draw_ctx(TermWin * tw)77 static void fuzz_free_draw_ctx(TermWin *tw) {}
fuzz_set_cursor_pos(TermWin * tw,int x,int y)78 static void fuzz_set_cursor_pos(TermWin *tw, int x, int y) {}
fuzz_set_raw_mouse_mode(TermWin * tw,bool enable)79 static void fuzz_set_raw_mouse_mode(TermWin *tw, bool enable) {}
fuzz_set_scrollbar(TermWin * tw,int total,int start,int page)80 static void fuzz_set_scrollbar(TermWin *tw, int total, int start, int page) {}
fuzz_bell(TermWin * tw,int mode)81 static void fuzz_bell(TermWin *tw, int mode) {}
fuzz_clip_write(TermWin * tw,int clipboard,wchar_t * text,int * attrs,truecolour * colours,int len,bool must_deselect)82 static void fuzz_clip_write(
83     TermWin *tw, int clipboard, wchar_t *text, int *attrs,
84     truecolour *colours, int len, bool must_deselect) {}
fuzz_clip_request_paste(TermWin * tw,int clipboard)85 static void fuzz_clip_request_paste(TermWin *tw, int clipboard) {}
fuzz_refresh(TermWin * tw)86 static void fuzz_refresh(TermWin *tw) {}
fuzz_request_resize(TermWin * tw,int w,int h)87 static void fuzz_request_resize(TermWin *tw, int w, int h) {}
fuzz_set_title(TermWin * tw,const char * title)88 static void fuzz_set_title(TermWin *tw, const char *title) {}
fuzz_set_icon_title(TermWin * tw,const char * icontitle)89 static void fuzz_set_icon_title(TermWin *tw, const char *icontitle) {}
fuzz_set_minimised(TermWin * tw,bool minimised)90 static void fuzz_set_minimised(TermWin *tw, bool minimised) {}
fuzz_set_maximised(TermWin * tw,bool maximised)91 static void fuzz_set_maximised(TermWin *tw, bool maximised) {}
fuzz_move(TermWin * tw,int x,int y)92 static void fuzz_move(TermWin *tw, int x, int y) {}
fuzz_set_zorder(TermWin * tw,bool top)93 static void fuzz_set_zorder(TermWin *tw, bool top) {}
fuzz_palette_set(TermWin * tw,unsigned start,unsigned ncolours,const rgb * colours)94 static void fuzz_palette_set(TermWin *tw, unsigned start, unsigned ncolours,
95                              const rgb *colours) {}
fuzz_palette_get_overrides(TermWin * tw,Terminal * term)96 static void fuzz_palette_get_overrides(TermWin *tw, Terminal *term) {}
97 
98 static const TermWinVtable fuzz_termwin_vt = {
99     .setup_draw_ctx = fuzz_setup_draw_ctx,
100     .draw_text = fuzz_draw_text,
101     .draw_cursor = fuzz_draw_cursor,
102     .draw_trust_sigil = fuzz_draw_trust_sigil,
103     .char_width = fuzz_char_width,
104     .free_draw_ctx = fuzz_free_draw_ctx,
105     .set_cursor_pos = fuzz_set_cursor_pos,
106     .set_raw_mouse_mode = fuzz_set_raw_mouse_mode,
107     .set_scrollbar = fuzz_set_scrollbar,
108     .bell = fuzz_bell,
109     .clip_write = fuzz_clip_write,
110     .clip_request_paste = fuzz_clip_request_paste,
111     .refresh = fuzz_refresh,
112     .request_resize = fuzz_request_resize,
113     .set_title = fuzz_set_title,
114     .set_icon_title = fuzz_set_icon_title,
115     .set_minimised = fuzz_set_minimised,
116     .set_maximised = fuzz_set_maximised,
117     .move = fuzz_move,
118     .set_zorder = fuzz_set_zorder,
119     .palette_set = fuzz_palette_set,
120     .palette_get_overrides = fuzz_palette_get_overrides,
121 };
122 
ldisc_send(Ldisc * ldisc,const void * buf,int len,bool interactive)123 void ldisc_send(Ldisc *ldisc, const void *buf, int len, bool interactive) {}
ldisc_echoedit_update(Ldisc * ldisc)124 void ldisc_echoedit_update(Ldisc *ldisc) {}
modalfatalbox(const char * fmt,...)125 void modalfatalbox(const char *fmt, ...) { exit(0); }
nonfatal(const char * fmt,...)126 void nonfatal(const char *fmt, ...) { }
127 
128 /* needed by timing.c */
timer_change_notify(unsigned long next)129 void timer_change_notify(unsigned long next) { }
130 
131 /* needed by config.c and sercfg.c */
132 
dlg_radiobutton_set(union control * ctrl,dlgparam * dp,int whichbutton)133 void dlg_radiobutton_set(union control *ctrl, dlgparam *dp, int whichbutton) { }
dlg_radiobutton_get(union control * ctrl,dlgparam * dp)134 int dlg_radiobutton_get(union control *ctrl, dlgparam *dp) { return 0; }
dlg_checkbox_set(union control * ctrl,dlgparam * dp,bool checked)135 void dlg_checkbox_set(union control *ctrl, dlgparam *dp, bool checked) { }
dlg_checkbox_get(union control * ctrl,dlgparam * dp)136 bool dlg_checkbox_get(union control *ctrl, dlgparam *dp) { return false; }
dlg_editbox_set(union control * ctrl,dlgparam * dp,char const * text)137 void dlg_editbox_set(union control *ctrl, dlgparam *dp, char const *text) { }
dlg_editbox_get(union control * ctrl,dlgparam * dp)138 char *dlg_editbox_get(union control *ctrl, dlgparam *dp)
139 { return dupstr("moo"); }
dlg_listbox_clear(union control * ctrl,dlgparam * dp)140 void dlg_listbox_clear(union control *ctrl, dlgparam *dp) { }
dlg_listbox_del(union control * ctrl,dlgparam * dp,int index)141 void dlg_listbox_del(union control *ctrl, dlgparam *dp, int index) { }
dlg_listbox_add(union control * ctrl,dlgparam * dp,char const * text)142 void dlg_listbox_add(union control *ctrl, dlgparam *dp, char const *text) { }
dlg_listbox_addwithid(union control * ctrl,dlgparam * dp,char const * text,int id)143 void dlg_listbox_addwithid(union control *ctrl, dlgparam *dp,
144                            char const *text, int id) { }
dlg_listbox_getid(union control * ctrl,dlgparam * dp,int index)145 int dlg_listbox_getid(union control *ctrl, dlgparam *dp, int index)
146 { return 0; }
dlg_listbox_index(union control * ctrl,dlgparam * dp)147 int dlg_listbox_index(union control *ctrl, dlgparam *dp) { return -1; }
dlg_listbox_issel(union control * ctrl,dlgparam * dp,int index)148 bool dlg_listbox_issel(union control *ctrl, dlgparam *dp, int index)
149 { return false; }
dlg_listbox_select(union control * ctrl,dlgparam * dp,int index)150 void dlg_listbox_select(union control *ctrl, dlgparam *dp, int index) { }
dlg_text_set(union control * ctrl,dlgparam * dp,char const * text)151 void dlg_text_set(union control *ctrl, dlgparam *dp, char const *text) { }
dlg_filesel_set(union control * ctrl,dlgparam * dp,Filename * fn)152 void dlg_filesel_set(union control *ctrl, dlgparam *dp, Filename *fn) { }
dlg_filesel_get(union control * ctrl,dlgparam * dp)153 Filename *dlg_filesel_get(union control *ctrl, dlgparam *dp) { return NULL; }
dlg_fontsel_set(union control * ctrl,dlgparam * dp,FontSpec * fn)154 void dlg_fontsel_set(union control *ctrl, dlgparam *dp, FontSpec *fn) { }
dlg_fontsel_get(union control * ctrl,dlgparam * dp)155 FontSpec *dlg_fontsel_get(union control *ctrl, dlgparam *dp) { return NULL; }
dlg_update_start(union control * ctrl,dlgparam * dp)156 void dlg_update_start(union control *ctrl, dlgparam *dp) { }
dlg_update_done(union control * ctrl,dlgparam * dp)157 void dlg_update_done(union control *ctrl, dlgparam *dp) { }
dlg_set_focus(union control * ctrl,dlgparam * dp)158 void dlg_set_focus(union control *ctrl, dlgparam *dp) { }
dlg_label_change(union control * ctrl,dlgparam * dp,char const * text)159 void dlg_label_change(union control *ctrl, dlgparam *dp, char const *text) { }
dlg_last_focused(union control * ctrl,dlgparam * dp)160 union control *dlg_last_focused(union control *ctrl, dlgparam *dp)
161 { return NULL; }
dlg_beep(dlgparam * dp)162 void dlg_beep(dlgparam *dp) { }
dlg_error_msg(dlgparam * dp,const char * msg)163 void dlg_error_msg(dlgparam *dp, const char *msg) { }
dlg_end(dlgparam * dp,int value)164 void dlg_end(dlgparam *dp, int value) { }
dlg_coloursel_start(union control * ctrl,dlgparam * dp,int r,int g,int b)165 void dlg_coloursel_start(union control *ctrl, dlgparam *dp,
166                          int r, int g, int b) { }
dlg_coloursel_results(union control * ctrl,dlgparam * dp,int * r,int * g,int * b)167 bool dlg_coloursel_results(union control *ctrl, dlgparam *dp,
168                            int *r, int *g, int *b) { return false; }
dlg_refresh(union control * ctrl,dlgparam * dp)169 void dlg_refresh(union control *ctrl, dlgparam *dp) { }
dlg_is_visible(union control * ctrl,dlgparam * dp)170 bool dlg_is_visible(union control *ctrl, dlgparam *dp) { return false; }
171 
172 const char *const appname = "FuZZterm";
173 const int ngsslibs = 0;
174 const char *const gsslibnames[0] = { };
175 const struct keyvalwhere gsslibkeywords[0] = { };
176 
177 /*
178  * Default settings that are specific to Unix plink.
179  */
platform_default_s(const char * name)180 char *platform_default_s(const char *name)
181 {
182     if (!strcmp(name, "TermType"))
183         return dupstr(getenv("TERM"));
184     if (!strcmp(name, "SerialLine"))
185         return dupstr("/dev/ttyS0");
186     return NULL;
187 }
188 
platform_default_b(const char * name,bool def)189 bool platform_default_b(const char *name, bool def)
190 {
191     return def;
192 }
193 
platform_default_i(const char * name,int def)194 int platform_default_i(const char *name, int def)
195 {
196     return def;
197 }
198 
platform_default_fontspec(const char * name)199 FontSpec *platform_default_fontspec(const char *name)
200 {
201     return fontspec_new("");
202 }
203 
platform_default_filename(const char * name)204 Filename *platform_default_filename(const char *name)
205 {
206     if (!strcmp(name, "LogFileName"))
207         return filename_from_str("putty.log");
208     else
209         return filename_from_str("");
210 }
211 
x_get_default(const char * key)212 char *x_get_default(const char *key)
213 {
214     return NULL;                       /* this is a stub */
215 }
216