diff --git a/ChangeLog b/ChangeLog index cbb651ae..41c403e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Apr 24 13:56:53 CEST 2008 Daniel Veillard + + * uri.c: applied patch from Ashwin fixing a number of realloc problems + * HTMLparser.c: improve handling for misplaced html/head/body + Tue Apr 22 10:27:17 CEST 2008 Daniel Veillard * dict.c: improvement on the hashing of the dictionnary, with visible diff --git a/HTMLparser.c b/HTMLparser.c index 92503a1a..00cd6ad8 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -3482,6 +3482,7 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { "htmlParseStartTag: misplaced tag\n", name, NULL); discardtag = 1; + ctxt->depth++; } if ((ctxt->nameNr != 1) && (xmlStrEqual(name, BAD_CAST"head"))) { @@ -3489,6 +3490,7 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { "htmlParseStartTag: misplaced tag\n", name, NULL); discardtag = 1; + ctxt->depth++; } if (xmlStrEqual(name, BAD_CAST"body")) { int indx; @@ -3498,6 +3500,7 @@ htmlParseStartTag(htmlParserCtxtPtr ctxt) { "htmlParseStartTag: misplaced tag\n", name, NULL); discardtag = 1; + ctxt->depth++; } } } @@ -3648,7 +3651,6 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) name = htmlParseHTMLName(ctxt); if (name == NULL) return (0); - /* * We should definitely be at the ending "S? '>'" part */ @@ -3668,6 +3670,18 @@ htmlParseEndTag(htmlParserCtxtPtr ctxt) } else NEXT; + /* + * if we ignored misplaced tags in htmlParseStartTag don't pop them + * out now. + */ + if ((ctxt->depth > 0) && + (xmlStrEqual(name, BAD_CAST "html") || + xmlStrEqual(name, BAD_CAST "body") || + xmlStrEqual(name, BAD_CAST "head"))) { + ctxt->depth--; + return (0); + } + /* * If the name read is not one of the element in the parsing stack * then return, it's just an error. diff --git a/uri.c b/uri.c index fafd1125..a47f9894 100644 --- a/uri.c +++ b/uri.c @@ -225,6 +225,7 @@ xmlCreateURI(void) { xmlChar * xmlSaveUri(xmlURIPtr uri) { xmlChar *ret = NULL; + xmlChar *temp; const char *p; int len; int max; @@ -246,23 +247,27 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = *p++; } if (len >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = ':'; } @@ -271,12 +276,14 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p))) ret[len++] = *p++; @@ -292,12 +299,14 @@ xmlSaveUri(xmlURIPtr uri) { if (uri->server != NULL) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = '/'; ret[len++] = '/'; @@ -306,13 +315,15 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } if ((IS_UNRESERVED(*(p))) || ((*(p) == ';')) || ((*(p) == ':')) || @@ -330,13 +341,15 @@ xmlSaveUri(xmlURIPtr uri) { } if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = '@'; } @@ -344,39 +357,45 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = *p++; } if (uri->port > 0) { if (len + 10 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } len += snprintf((char *) &ret[len], max - len, ":%d", uri->port); } } else if (uri->authority != NULL) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = '/'; ret[len++] = '/'; @@ -384,13 +403,15 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } if ((IS_UNRESERVED(*(p))) || ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) || @@ -408,13 +429,15 @@ xmlSaveUri(xmlURIPtr uri) { } else if (uri->scheme != NULL) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = '/'; ret[len++] = '/'; @@ -448,13 +471,15 @@ xmlSaveUri(xmlURIPtr uri) { while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) || ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) || @@ -473,52 +498,60 @@ xmlSaveUri(xmlURIPtr uri) { if (uri->query_raw != NULL) { if (len + 1 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = '?'; p = uri->query_raw; while (*p != 0) { if (len + 1 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ret[len++] = *p++; } } else if (uri->query != NULL) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = '?'; p = uri->query; while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlSaveUri: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) ret[len++] = *p++; @@ -535,26 +568,30 @@ xmlSaveUri(xmlURIPtr uri) { if (uri->fragment != NULL) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = '#'; p = uri->fragment; while (*p != 0) { if (len + 3 >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) ret[len++] = *p++; @@ -569,12 +606,14 @@ xmlSaveUri(xmlURIPtr uri) { } if (len >= max) { max *= 2; - ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); - if (ret == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlSaveUri: out of memory\n"); - return(NULL); - } + temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar)); + if (temp == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlSaveUri: out of memory\n"); + xmlFree(ret); + return(NULL); + } + ret = temp; } ret[len++] = 0; return(ret); @@ -928,6 +967,7 @@ xmlURIUnescapeString(const char *str, int len, char *target) { xmlChar * xmlURIEscapeStr(const xmlChar *str, const xmlChar *list) { xmlChar *ret, ch; + xmlChar *temp; const xmlChar *in; unsigned int len, out; @@ -951,12 +991,14 @@ xmlURIEscapeStr(const xmlChar *str, const xmlChar *list) { while(*in != 0) { if (len - out <= 3) { len += 20; - ret = (xmlChar *) xmlRealloc(ret, len); - if (ret == NULL) { + temp = (xmlChar *) xmlRealloc(ret, len); + if (temp == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlURIEscapeStr: out of memory\n"); + xmlFree(ret); return(NULL); } + ret = temp; } ch = *in; @@ -1009,7 +1051,8 @@ xmlURIEscape(const xmlChar * str) #define NULLCHK(p) if(!p) { \ xmlGenericError(xmlGenericErrorContext, \ "xmlURIEscape: out of memory\n"); \ - return NULL; } + xmlFreeURI(uri); \ + return NULL; } \ if (str == NULL) return (NULL);