sync XML fixes - frontends - front-ends for some sites (experiment) | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3bd1b33c5fd37216f8a721d9fac3148345365c0f | |
parent 3294b8cba72843f441445c1e6608e9d7477453db | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Fri, 22 Jan 2021 13:33:48 +0100 | |
sync XML fixes | |
Diffstat: | |
M xml.c | 21 +++++++++++---------- | |
M xml.h | 6 ++++-- | |
2 files changed, 15 insertions(+), 12 deletions(-) | |
--- | |
diff --git a/xml.c b/xml.c | |
@@ -147,7 +147,7 @@ xml_parsecomment(XMLParser *x) | |
x->xmlcommentstart(x); | |
while ((c = GETNEXT()) != EOF) { | |
if (c == '-' || c == '>') { | |
- if (x->xmlcomment) { | |
+ if (x->xmlcomment && datalen) { | |
x->data[datalen] = '\0'; | |
x->xmlcomment(x, x->data, datalen); | |
datalen = 0; | |
@@ -196,7 +196,7 @@ xml_parsecdata(XMLParser *x) | |
x->xmlcdatastart(x); | |
while ((c = GETNEXT()) != EOF) { | |
if (c == ']' || c == '>') { | |
- if (x->xmlcdata) { | |
+ if (x->xmlcdata && datalen) { | |
x->data[datalen] = '\0'; | |
x->xmlcdata(x, x->data, datalen); | |
datalen = 0; | |
@@ -295,7 +295,7 @@ namedentitytostr(const char *e, char *buf, size_t bufsiz) | |
return 1; | |
} | |
} | |
- return 0; | |
+ return -1; | |
} | |
static int | |
@@ -312,12 +312,13 @@ numericentitytostr(const char *e, char *buf, size_t bufsi… | |
errno = 0; | |
/* hex (16) or decimal (10) */ | |
if (*e == 'x') | |
- l = strtoul(e + 1, &end, 16); | |
+ l = strtol(++e, &end, 16); | |
else | |
- l = strtoul(e, &end, 10); | |
- /* invalid value or not a well-formed entity or too high codepoint */ | |
- if (errno || *end != ';' || l > 0x10FFFF) | |
- return 0; | |
+ l = strtol(e, &end, 10); | |
+ /* invalid value or not a well-formed entity or invalid code point */ | |
+ if (errno || e == end || *end != ';' || l < 0 || l > 0x10ffff || | |
+ (l >= 0xd800 && l <= 0xdffff)) | |
+ return -1; | |
len = codepointtoutf8(l, buf); | |
buf[len] = '\0'; | |
@@ -325,13 +326,13 @@ numericentitytostr(const char *e, char *buf, size_t bufsi… | |
} | |
/* convert named- or numeric entity string to buffer string | |
- * returns byte-length of string. */ | |
+ * returns byte-length of string or -1 on failure. */ | |
int | |
xml_entitytostr(const char *e, char *buf, size_t bufsiz) | |
{ | |
/* doesn't start with & */ | |
if (e[0] != '&') | |
- return 0; | |
+ return -1; | |
/* numeric entity */ | |
if (e[1] == '#') | |
return numericentitytostr(e + 2, buf, bufsiz); | |
diff --git a/xml.h b/xml.h | |
@@ -1,5 +1,7 @@ | |
-#ifndef _XML_H | |
-#define _XML_H | |
+#ifndef _XML_H_ | |
+#define _XML_H_ | |
+ | |
+#include <stdio.h> | |
typedef struct xmlparser { | |
/* handlers */ |