From 2a4a2fb9f116b50e7c80d573db06c0fdc6c69272 Mon Sep 17 00:00:00 2001 From: Tatsuya Kinoshita Date: Tue, 15 Nov 2016 20:11:52 +0900 Subject: Prevent infinite recursion with nested table and textarea Bug-Debian: https://github.com/tats/w3m/issues/20#issuecomment-260590257 --- file.c | 1 + proto.h | 1 + table.c | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/file.c b/file.c index d484451..534e5c9 100644 --- a/file.c +++ b/file.c @@ -6448,6 +6448,7 @@ HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal) do_blankline(h_env, obuf, indent, 0, h_env->limit); } save_fonteffect(h_env, obuf); + initRenderTable(); renderTable(tbl, tbl_width, h_env); restore_fonteffect(h_env, obuf); obuf->flag &= ~RB_IGNORE_P; diff --git a/proto.h b/proto.h index d744e14..ed8f890 100644 --- a/proto.h +++ b/proto.h @@ -393,6 +393,7 @@ extern void align(TextLine *lbuf, int width, int mode); extern void print_item(struct table *t, int row, int col, int width, Str buf); extern void print_sep(struct table *t, int row, int type, int maxcol, Str buf); extern void do_refill(struct table *tbl, int row, int col, int maxlimit); +extern void initRenderTable(void); extern void renderTable(struct table *t, int max_width, struct html_feed_environ *h_env); extern struct table *begin_table(int border, int spacing, int padding, diff --git a/table.c b/table.c index 33593b1..2c5c36d 100644 --- a/table.c +++ b/table.c @@ -1623,6 +1623,15 @@ get_table_width(struct table *t, short *orgwidth, short *cellwidth, int flag) #define fixed_table_width(t)\ (get_table_width(t,t->fixed_width,t->cell.fixed_width,CHECK_MINIMUM)) +#define MAX_COTABLE_LEVEL 100 +static int cotable_level; + +void +initRenderTable(void) +{ + cotable_level = 0; +} + void renderCoTable(struct table *tbl, int maxlimit) { @@ -1633,6 +1642,10 @@ renderCoTable(struct table *tbl, int maxlimit) int i, col, row; int indent, maxwidth; + if (cotable_level >= MAX_COTABLE_LEVEL) + return; /* workaround to prevent infinite recursion */ + cotable_level++; + for (i = 0; i < tbl->ntable; i++) { t = tbl->tables[i].ptr; col = tbl->tables[i].col; -- cgit v1.2.3