diff --git a/ChangeLog b/ChangeLog index 16ba83b4..b3936a75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Aug 14 02:28:36 CEST 2003 Daniel Veillard + + * parser.c: fixed the serious CPU usage problem reported by + Grant Goodale + * HTMLparser.c: applied patch from Oliver Kidman about a free + missing in htmlSAXParseDoc + Tue Aug 12 22:48:10 HKT 2003 William Brack * doc/Makefile.am: Removed dependency from libxml2.def.src diff --git a/HTMLparser.c b/HTMLparser.c index 2168bbdf..8f9cfff3 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -5322,6 +5322,7 @@ htmlSAXParseDoc(xmlChar *cur, const char *encoding, htmlSAXHandlerPtr sax, void ctxt = htmlCreateDocParserCtxt(cur, encoding); if (ctxt == NULL) return(NULL); if (sax != NULL) { + if (ctxt->sax != NULL) xmlFree (ctxt->sax); ctxt->sax = sax; ctxt->userData = userData; } diff --git a/parser.c b/parser.c index 1a8ba365..cb7fce4f 100644 --- a/parser.c +++ b/parser.c @@ -369,7 +369,8 @@ static int spacePop(xmlParserCtxtPtr ctxt) { } while (0) #define SHRINK if ((ctxt->progressive == 0) && \ - (ctxt->input->cur - ctxt->input->base > INPUT_CHUNK))\ + (ctxt->input->cur - ctxt->input->base > INPUT_CHUNK) && \ + (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK)) \ xmlSHRINK (ctxt); static void xmlSHRINK (xmlParserCtxtPtr ctxt) { @@ -7581,8 +7582,21 @@ xmlParseEncodingDecl(xmlParserCtxtPtr ctxt) { if ((encoding != NULL) && ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-16")) || (!xmlStrcasecmp(encoding, BAD_CAST "UTF16")))) { - xmlFree(encoding); - encoding = NULL; + if (ctxt->input->encoding != NULL) + xmlFree((xmlChar *) ctxt->input->encoding); + ctxt->input->encoding = encoding; + encoding = NULL; + } + /* + * UTF-8 encoding is handled natively + */ + if ((encoding != NULL) && + ((!xmlStrcasecmp(encoding, BAD_CAST "UTF-8")) || + (!xmlStrcasecmp(encoding, BAD_CAST "UTF8")))) { + if (ctxt->input->encoding != NULL) + xmlFree((xmlChar *) ctxt->input->encoding); + ctxt->input->encoding = encoding; + encoding = NULL; } if (encoding != NULL) { xmlCharEncodingHandlerPtr handler;