- From: Victor Wagner <vitus@ice.ru>
- Date: Mon, 29 Nov 1999 17:47:27 +0300 (MSK)
- To: html-tidy@w3.org
On Mon, 29 Nov 1999, Victor Wagner wrote: > From: Victor Wagner <vitus@ice.ru> > Subject: Tidy nov99 segfaults on some htmls > > Dear sir, > > I've downloaded latest version of html-tidy to use as preprocessor in > our web-based publishing system, but found out that it segfaults > on some ill-formed html. Particular piece of html was produced by > RTF::Parser perl module ver 1.07, but I suspect that other converters > from office formats would give simular results. > Investigation shows that sometimes after DiscardElement call lexer->token still point to the element which was just freed. When then GetToken tries to access lexer->token->type at line 1195, various weird things happen. Following patch seems to fix problem diff -ru tidy24nov99/lexer.c tidy-fixed/lexer.c --- tidy24nov99/lexer.c Wed Nov 24 17:49:34 1999 +++ tidy-fixed/lexer.c Mon Nov 29 15:01:20 1999 @@ -1189,7 +1188,7 @@ Bool isempty; AttVal *attributes; - if (lexer->pushed) + if (lexer->pushed && lexer->token) { /* duplicate inlines in preference to pushed text nodes when appropriate */ if (lexer->token->type != TextNode || (!lexer->insert && !lexer->inode)) diff -ru tidy24nov99/parser.c tidy-fixed/parser.c --- tidy24nov99/parser.c Wed Nov 24 17:49:34 1999 +++ tidy-fixed/parser.c Mon Nov 29 15:01:01 1999 @@ -185,6 +185,9 @@ ReportWarning(lexer, element, null, TRIM_EMPTY_ELEMENT); DiscardElement(element); + if (element == lexer->token) { + lexer->token = NULL; + } } } @@ -793,6 +796,9 @@ { ReportWarning(lexer, element->parent, element, DISCARDING_UNEXPECTED); DiscardElement(element); + if (element==lexer->token) { + lexer->token = NULL; + } return; } } @@ -829,7 +835,9 @@ PopInline(lexer, node); FreeNode(node); - + if (node==lexer->token) { + lexer->token=NULL; + } if (!(mode & Preformatted)) TrimTrailingSpace(lexer, element->last); @@ -2608,6 +2616,9 @@ /* discard unexpected tags */ ReportWarning(lexer, body, node, DISCARDING_UNEXPECTED); FreeNode(node); + if (lexer->token == node) { + lexer->token = NULL; + } } } -------------------------------------------------- Victor Wagner vitus@ice.ru Programmer Office:7-(095)-203-50-60 Institute for Commerce Home: 7-(095)-135-46-61 Engineering http://www.ice.ru/~vitus
Received on Monday, 29 November 1999 09:47:33 UTC