From 4fb87ee5858178aa040c30b14a16f82f8cb76276 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Tue, 19 Sep 2000 12:25:59 +0000 Subject: [PATCH] Various contributed patches: - uri.c: applied patch for URI escaping from Wayne Davison - tree.c parserInternals.c HTMLparser.c: memset checks patches from Denis Barbier - HTMLparser.c: UTF8 characters in HTML tag-attribute values patch from Wayne Davison Daniel --- ChangeLog | 9 +++ HTMLparser.c | 7 ++- parserInternals.c | 3 +- tree.c | 1 + uri.c | 138 ++++++++-------------------------------------- 5 files changed, 40 insertions(+), 118 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8385ce23..c4cac365 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Tue Sep 19 14:20:10 CEST 2000 Daniel Veillard + + * uri.c: applied patch for URI escaping from Wayne Davison + + * tree.c parserInternals.c HTMLparser.c: memset checks patches + from Denis Barbier + * HTMLparser.c: UTF8 characters in HTML tag-attribute values + patch from Wayne Davison + Sun Sep 17 18:37:03 CEST 2000 Daniel Veillard * doc/xml.html : updated with new releases, adding "how to help" diff --git a/HTMLparser.c b/HTMLparser.c index 7d99fcb5..a2527666 100644 --- a/HTMLparser.c +++ b/HTMLparser.c @@ -1970,7 +1970,7 @@ htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { } } else { unsigned int c; - int bits; + int bits, l; if (out - buffer > buffer_size - 100) { int index = out - buffer; @@ -1978,7 +1978,7 @@ htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) { growBuffer(buffer); out = &buffer[index]; } - c = CUR; + c = CUR_CHAR(l); if (c < 0x80) { *out++ = c; bits= -6; } else if (c < 0x800) @@ -3526,7 +3526,8 @@ htmlInitParserCtxt(htmlParserCtxtPtr ctxt) if (sax == NULL) { fprintf(stderr, "htmlInitParserCtxt: out of memory\n"); } - memset(sax, 0, sizeof(htmlSAXHandler)); + else + memset(sax, 0, sizeof(htmlSAXHandler)); /* Allocate the Input stack */ ctxt->inputTab = (htmlParserInputPtr *) diff --git a/parserInternals.c b/parserInternals.c index de757aa4..ec5c7eae 100644 --- a/parserInternals.c +++ b/parserInternals.c @@ -2054,7 +2054,8 @@ xmlInitParserCtxt(xmlParserCtxtPtr ctxt) if (sax == NULL) { fprintf(stderr, "xmlInitParserCtxt: out of memory\n"); } - memset(sax, 0, sizeof(xmlSAXHandler)); + else + memset(sax, 0, sizeof(xmlSAXHandler)); /* Allocate the Input stack */ ctxt->inputTab = (xmlParserInputPtr *) xmlMalloc(5 * sizeof(xmlParserInputPtr)); diff --git a/tree.c b/tree.c index 51741348..9e6a6a6a 100644 --- a/tree.c +++ b/tree.c @@ -3959,6 +3959,7 @@ xmlBufferFree(xmlBufferPtr buf) { */ void xmlBufferEmpty(xmlBufferPtr buf) { + if (buf->content == NULL) return; buf->use = 0; memset(buf->content, -1, buf->size);/* just for debug */ } diff --git a/uri.c b/uri.c index ec915e0b..bc77690c 100644 --- a/uri.c +++ b/uri.c @@ -254,26 +254,11 @@ xmlSaveUri(xmlURIPtr uri) { ((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ','))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } if (len >= max) { @@ -314,26 +299,11 @@ xmlSaveUri(xmlURIPtr uri) { ((*(p) == ','))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } if (len + 3 >= max) { @@ -396,26 +366,11 @@ xmlSaveUri(xmlURIPtr uri) { ((*(p) == '=')) || ((*(p) == '+'))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } } @@ -436,26 +391,11 @@ xmlSaveUri(xmlURIPtr uri) { ((*(p) == ','))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } } @@ -482,26 +422,11 @@ xmlSaveUri(xmlURIPtr uri) { if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } } @@ -528,26 +453,11 @@ xmlSaveUri(xmlURIPtr uri) { if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) ret[len++] = *p++; else { - int val = *p++; + int val = *(unsigned char *)p++; + int hi = val / 0x10, lo = val % 0x10; ret[len++] = '%'; - switch (val / 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val / 0x10); - } - switch (val % 0x10) { - case 0xF: ret[len++] = 'F'; break; - case 0xE: ret[len++] = 'E'; break; - case 0xD: ret[len++] = 'D'; break; - case 0xC: ret[len++] = 'C'; break; - case 0xB: ret[len++] = 'B'; break; - case 0xA: ret[len++] = 'A'; break; - default: ret[len++] = '0' + (val % 0x10); - } + ret[len++] = hi + (hi > 9? 'A'-10 : '0'); + ret[len++] = lo + (lo > 9? 'A'-10 : '0'); } } }