sync XML fixes - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3bd1b33c5fd37216f8a721d9fac3148345365c0f
 (DIR) parent 3294b8cba72843f441445c1e6608e9d7477453db
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       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(-)
       ---
 (DIR) 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 bufsiz)
                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 bufsiz)
        }
        
        /* 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);
 (DIR) 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 */