[libxml2] Make sure not to call IS_BLANK_CH when parsing the DTD



commit d9e43c7db51ed97cfff6a2a065b6851bcbac59ac
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Mon Jun 19 18:01:23 2017 +0200

    Make sure not to call IS_BLANK_CH when parsing the DTD
    
    This is required to get rid of the "blanks wrapper" hack. Checking the
    return value of xmlSkipBlankChars is more efficient, too.

 parser.c |   93 +++++++++++++++++++++----------------------------------------
 1 files changed, 32 insertions(+), 61 deletions(-)
---
diff --git a/parser.c b/parser.c
index bf7ebc4..4556faa 100644
--- a/parser.c
+++ b/parser.c
@@ -4657,22 +4657,20 @@ xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) {
     *publicID = NULL;
     if (CMP6(CUR_PTR, 'S', 'Y', 'S', 'T', 'E', 'M')) {
         SKIP(6);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after 'SYSTEM'\n");
        }
-        SKIP_BLANKS;
        URI = xmlParseSystemLiteral(ctxt);
        if (URI == NULL) {
            xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL);
         }
     } else if (CMP6(CUR_PTR, 'P', 'U', 'B', 'L', 'I', 'C')) {
         SKIP(6);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                    "Space required after 'PUBLIC'\n");
        }
-        SKIP_BLANKS;
        *publicID = xmlParsePubidLiteral(ctxt);
        if (*publicID == NULL) {
            xmlFatalErr(ctxt, XML_ERR_PUBID_REQUIRED, NULL);
@@ -4681,26 +4679,20 @@ xmlParseExternalID(xmlParserCtxtPtr ctxt, xmlChar **publicID, int strict) {
            /*
             * We don't handle [83] so "S SystemLiteral" is required.
             */
-           if (!IS_BLANK_CH(CUR)) {
+           if (SKIP_BLANKS == 0) {
                xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                        "Space required after the Public Identifier\n");
            }
        } else {
            /*
             * We handle [83] so we return immediately, if
-            * "S SystemLiteral" is not detected. From a purely parsing
-            * point of view that's a nice mess.
+            * "S SystemLiteral" is not detected. We skip blanks if no
+             * system literal was found, but this is harmless since we must
+             * be at the end of a NotationDecl.
             */
-           const xmlChar *ptr;
-           GROW;
-
-           ptr = CUR_PTR;
-           if (!IS_BLANK_CH(*ptr)) return(NULL);
-
-           while (IS_BLANK_CH(*ptr)) ptr++; /* TODO: dangerous, fix ! */
-           if ((*ptr != '\'') && (*ptr != '"')) return(NULL);
+           if (SKIP_BLANKS == 0) return(NULL);
+           if ((CUR != '\'') && (CUR != '"')) return(NULL);
        }
-        SKIP_BLANKS;
        URI = xmlParseSystemLiteral(ctxt);
        if (URI == NULL) {
            xmlFatalErr(ctxt, XML_ERR_URI_REQUIRED, NULL);
@@ -5188,12 +5180,10 @@ xmlParsePI(xmlParserCtxtPtr ctxt) {
                ctxt->instate = state;
                return;
            }
-           cur = CUR;
-           if (!IS_BLANK(cur)) {
+           if (SKIP_BLANKS == 0) {
                xmlFatalErrMsgStr(ctxt, XML_ERR_SPACE_REQUIRED,
                          "ParsePI: PI %s space expected\n", target);
            }
-            SKIP_BLANKS;
            cur = CUR_CHAR(l);
            while (IS_CHAR(cur) && /* checked */
                   ((cur != '?') || (NXT(1) != '>'))) {
@@ -5311,29 +5301,27 @@ xmlParseNotationDecl(xmlParserCtxtPtr ctxt) {
        int inputid = ctxt->input->id;
        SHRINK;
        SKIP(10);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after '<!NOTATION'\n");
            return;
        }
-       SKIP_BLANKS;
 
         name = xmlParseName(ctxt);
        if (name == NULL) {
            xmlFatalErr(ctxt, XML_ERR_NOTATION_NOT_STARTED, NULL);
            return;
        }
-       if (!IS_BLANK_CH(CUR)) {
-           xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-                    "Space required after the NOTATION name'\n");
-           return;
-       }
        if (xmlStrchr(name, ':') != NULL) {
            xmlNsErr(ctxt, XML_NS_ERR_COLON,
                     "colons are forbidden from notation names '%s'\n",
                     name, NULL, NULL);
        }
-       SKIP_BLANKS;
+       if (SKIP_BLANKS == 0) {
+           xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+                    "Space required after the NOTATION name'\n");
+           return;
+       }
 
        /*
         * Parse the IDs.
@@ -5389,23 +5377,20 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
     const xmlChar *ndata = NULL;
     int isParameter = 0;
     xmlChar *orig = NULL;
-    int skipped;
 
     /* GROW; done in the caller */
     if (CMP8(CUR_PTR, '<', '!', 'E', 'N', 'T', 'I', 'T', 'Y')) {
        int inputid = ctxt->input->id;
        SHRINK;
        SKIP(8);
-       skipped = SKIP_BLANKS;
-       if (skipped == 0) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after '<!ENTITY'\n");
        }
 
        if (RAW == '%') {
            NEXT;
-           skipped = SKIP_BLANKS;
-           if (skipped == 0) {
+           if (SKIP_BLANKS == 0) {
                xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                               "Space required after '%%'\n");
            }
@@ -5423,8 +5408,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
                     "colons are forbidden from entities names '%s'\n",
                     name, NULL, NULL);
        }
-        skipped = SKIP_BLANKS;
-       if (skipped == 0) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after the entity name\n");
        }
@@ -5535,18 +5519,16 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
                        xmlFreeURI(uri);
                    }
                }
-               if ((RAW != '>') && (!IS_BLANK_CH(CUR))) {
+               if ((RAW != '>') && (SKIP_BLANKS == 0)) {
                    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                                   "Space required before 'NDATA'\n");
                }
-               SKIP_BLANKS;
                if (CMP5(CUR_PTR, 'N', 'D', 'A', 'T', 'A')) {
                    SKIP(5);
-                   if (!IS_BLANK_CH(CUR)) {
+                   if (SKIP_BLANKS == 0) {
                        xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                                       "Space required after 'NDATA'\n");
                    }
-                   SKIP_BLANKS;
                    ndata = xmlParseName(ctxt);
                    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
                        (ctxt->sax->unparsedEntityDecl != NULL))
@@ -5678,11 +5660,10 @@ xmlParseDefaultDecl(xmlParserCtxtPtr ctxt, xmlChar **value) {
     if (CMP6(CUR_PTR, '#', 'F', 'I', 'X', 'E', 'D')) {
        SKIP(6);
        val = XML_ATTRIBUTE_FIXED;
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after '#FIXED'\n");
        }
-       SKIP_BLANKS;
     }
     ret = xmlParseAttValue(ctxt);
     ctxt->instate = XML_PARSER_DTD;
@@ -5854,12 +5835,11 @@ int
 xmlParseEnumeratedType(xmlParserCtxtPtr ctxt, xmlEnumerationPtr *tree) {
     if (CMP8(CUR_PTR, 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N')) {
        SKIP(8);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after 'NOTATION'\n");
            return(0);
        }
-        SKIP_BLANKS;
        *tree = xmlParseNotationType(ctxt);
        if (*tree == NULL) return(0);
        return(XML_ATTRIBUTE_NOTATION);
@@ -5966,11 +5946,10 @@ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
        int inputid = ctxt->input->id;
 
        SKIP(9);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                                 "Space required after '<!ATTLIST'\n");
        }
-        SKIP_BLANKS;
         elemName = xmlParseName(ctxt);
        if (elemName == NULL) {
            xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
@@ -5993,12 +5972,11 @@ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
                break;
            }
            GROW;
-           if (!IS_BLANK_CH(CUR)) {
+           if (SKIP_BLANKS == 0) {
                xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                        "Space required after the attribute name\n");
                break;
            }
-           SKIP_BLANKS;
 
            type = xmlParseAttributeType(ctxt, &tree);
            if (type <= 0) {
@@ -6006,14 +5984,13 @@ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
            }
 
            GROW;
-           if (!IS_BLANK_CH(CUR)) {
+           if (SKIP_BLANKS == 0) {
                xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                               "Space required after the attribute type\n");
                if (tree != NULL)
                    xmlFreeEnumeration(tree);
                break;
            }
-           SKIP_BLANKS;
 
            def = xmlParseDefaultDecl(ctxt, &defaultValue);
            if (def <= 0) {
@@ -6028,7 +6005,7 @@ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
 
            GROW;
             if (RAW != '>') {
-               if (!IS_BLANK_CH(CUR)) {
+               if (SKIP_BLANKS == 0) {
                    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                        "Space required after the attribute default value\n");
                    if (defaultValue != NULL)
@@ -6037,7 +6014,6 @@ xmlParseAttributeListDecl(xmlParserCtxtPtr ctxt) {
                        xmlFreeEnumeration(tree);
                    break;
                }
-               SKIP_BLANKS;
            }
            if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
                (ctxt->sax->attributeDecl != NULL))
@@ -6580,23 +6556,21 @@ xmlParseElementDecl(xmlParserCtxtPtr ctxt) {
        int inputid = ctxt->input->id;
 
        SKIP(9);
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after 'ELEMENT'\n");
            return(-1);
        }
-        SKIP_BLANKS;
         name = xmlParseName(ctxt);
        if (name == NULL) {
            xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
                           "xmlParseElementDecl: no name for Element\n");
            return(-1);
        }
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space required after the element name\n");
        }
-        SKIP_BLANKS;
        if (CMP5(CUR_PTR, 'E', 'M', 'P', 'T', 'Y')) {
            SKIP(5);
            /*
@@ -6919,11 +6893,10 @@ xmlParseTextDecl(xmlParserCtxtPtr ctxt) {
        return;
     }
 
-    if (!IS_BLANK_CH(CUR)) {
+    if (SKIP_BLANKS == 0) {
        xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                       "Space needed after '<?xml'\n");
     }
-    SKIP_BLANKS;
 
     /*
      * We may have the VersionInfo here.
@@ -6932,7 +6905,7 @@ xmlParseTextDecl(xmlParserCtxtPtr ctxt) {
     if (version == NULL)
        version = xmlCharStrdup(XML_DEFAULT_VERSION);
     else {
-       if (!IS_BLANK_CH(CUR)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "Space needed here\n");
        }
@@ -8593,11 +8566,10 @@ failed:
        GROW
        if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
            break;
-       if (!IS_BLANK_CH(RAW)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "attributes construct error\n");
        }
-       SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
            xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
@@ -9473,12 +9445,11 @@ next_attr:
             break;
        if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
            break;
-       if (!IS_BLANK_CH(RAW)) {
+       if (SKIP_BLANKS == 0) {
            xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
                           "attributes construct error\n");
            break;
        }
-       SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
            xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]