diff -p -r1.84 HTMLparser.c *** HTMLparser.c 2000/11/17 16:08:49 1.84 --- HTMLparser.c 2000/11/17 21:49:32 *************** htmlCheckImplied(htmlParserCtxtPtr ctxt, *** 855,867 **** } if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) return; ! if (ctxt->nameNr <= 1) { ! if ((xmlStrEqual(newtag, BAD_CAST"script")) || ! (xmlStrEqual(newtag, BAD_CAST"style")) || ! (xmlStrEqual(newtag, BAD_CAST"meta")) || ! (xmlStrEqual(newtag, BAD_CAST"link")) || ! (xmlStrEqual(newtag, BAD_CAST"title")) || ! (xmlStrEqual(newtag, BAD_CAST"base"))) { /* * dropped OBJECT ... i you put it first BODY will be * assumed ! --- 855,867 ---- } if ((xmlStrEqual(newtag, BAD_CAST"body")) || (xmlStrEqual(newtag, BAD_CAST"head"))) return; ! if ((ctxt->nameNr <= 1) && ! ((xmlStrEqual(newtag, BAD_CAST"script")) || ! (xmlStrEqual(newtag, BAD_CAST"style")) || ! (xmlStrEqual(newtag, BAD_CAST"meta")) || ! (xmlStrEqual(newtag, BAD_CAST"link")) || ! (xmlStrEqual(newtag, BAD_CAST"title")) || ! (xmlStrEqual(newtag, BAD_CAST"base")))) { /* * dropped OBJECT ... i you put it first BODY will be * assumed ! *************** htmlCheckImplied(htmlParserCtxtPtr ctxt, *** 872,885 **** htmlnamePush(ctxt, xmlStrdup(BAD_CAST"head")); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); ! } else { #ifdef DEBUG ! xmlGenericError(xmlGenericErrorContext,"Implied element body: pushed body\n"); #endif ! htmlnamePush(ctxt, xmlStrdup(BAD_CAST"body")); ! if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ! ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); ! } } } --- 872,896 ---- htmlnamePush(ctxt, xmlStrdup(BAD_CAST"head")); if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ctxt->sax->startElement(ctxt->userData, BAD_CAST"head", NULL); ! } else if ((!xmlStrEqual(newtag, BAD_CAST"noframes")) && ! (!xmlStrEqual(newtag, BAD_CAST"frame")) && ! (!xmlStrEqual(newtag, BAD_CAST"frameset"))) { ! int i; ! for (i = 0;i < ctxt->nameNr;i++) { ! if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { ! return; ! } ! if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"head")) { ! return; ! } ! } ! #ifdef DEBUG ! xmlGenericError(xmlGenericErrorContext,"Implied element body: pushed body\n"); #endif ! htmlnamePush(ctxt, xmlStrdup(BAD_CAST"body")); ! if ((ctxt->sax != NULL) && (ctxt->sax->startElement != NULL)) ! ctxt->sax->startElement(ctxt->userData, BAD_CAST"body", NULL); } } *************** htmlParseStartTag(htmlParserCtxtPtr ctxt *** 2931,2936 **** --- 2942,2982 ---- * Check for implied HTML elements. */ htmlCheckImplied(ctxt, name); + + /* + * Avoid html at any level > 0, head at any level != 1 + * or any attempt to recurse body + */ + if ((ctxt->nameNr > 0) && (xmlStrEqual(name, BAD_CAST"html"))) { + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "htmlParseStartTag: misplaced tag\n"); + ctxt->wellFormed = 0; + xmlFree(name); + return; + } + if ((ctxt->nameNr != 1) && + (xmlStrEqual(name, BAD_CAST"head"))) { + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "htmlParseStartTag: misplaced tag\n"); + ctxt->wellFormed = 0; + xmlFree(name); + return; + } + if (xmlStrEqual(name, BAD_CAST"body")) { + int i; + for (i = 0;i < ctxt->nameNr;i++) { + if (xmlStrEqual(ctxt->nameTab[i], BAD_CAST"body")) { + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "htmlParseStartTag: misplaced tag\n"); + ctxt->wellFormed = 0; + xmlFree(name); + return; + } + } + } /* * Now parse the attributes, it ends up with the ending