[libxml2] Make testchar return an error on failure



commit 41a1943057ae1569455a589f99e6225f636ae82d
Author: Tony Tascioglu <tony tascioglu windriver com>
Date:   Sun Apr 3 17:54:23 2022 +0200

    Make testchar return an error on failure

 testchar.c | 157 +++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 111 insertions(+), 46 deletions(-)
---
diff --git a/testchar.c b/testchar.c
index 51e4acfc..bd1a8d64 100644
--- a/testchar.c
+++ b/testchar.c
@@ -23,7 +23,7 @@ static void errorHandler(void *unused, xmlErrorPtr err) {
 char document1[100] = "<doc>XXXX</doc>";
 char document2[100] = "<doc foo='XXXX'/>";
 
-static void testDocumentRangeByte1(xmlParserCtxtPtr ctxt, char *document,
+static int testDocumentRangeByte1(xmlParserCtxtPtr ctxt, char *document,
                   int len,  char *data, int forbid1, int forbid2) {
     int i;
     xmlDocPtr res;
@@ -37,33 +37,41 @@ static void testDocumentRangeByte1(xmlParserCtxtPtr ctxt, char *document,
        res = xmlReadMemory(document, len, "test", NULL, 0);
 
        if ((i == forbid1) || (i == forbid2)) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
                    "Failed to detect invalid char for Byte 0x%02X: %c\n",
                        i, i);
+               return(1);
+           }
        }
 
        else if ((i == '<') || (i == '&')) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
                    "Failed to detect illegal char %c for Byte 0x%02X\n", i, i);
+               return(1);
+           }
        }
        else if (((i < 0x20) || (i >= 0x80)) &&
            (i != 0x9) && (i != 0xA) && (i != 0xD)) {
-           if ((lastError != XML_ERR_INVALID_CHAR) && (res != NULL))
+           if ((lastError != XML_ERR_INVALID_CHAR) && (res != NULL)) {
                fprintf(stderr,
                    "Failed to detect invalid char for Byte 0x%02X\n", i);
+               return(1);
+           }
        }
        else if (res == NULL) {
            fprintf(stderr,
                "Failed to parse valid char for Byte 0x%02X : %c\n", i, i);
+               return(1);
        }
        if (res != NULL)
            xmlFreeDoc(res);
     }
+    return(0);
 }
 
-static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
+static int testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
                   int len,  char *data) {
     int i, j;
     xmlDocPtr res;
@@ -80,10 +88,12 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
 
        /* if first bit of first char is set, then second bit must too */
        if ((i & 0x80) && ((i & 0x40) == 0)) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
                "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
                        i, j);
+               return(1);
+           }
        }
 
        /*
@@ -91,10 +101,12 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
         * bits must be 10
         */
        else if ((i & 0x80) && ((j & 0xC0) != 0x80)) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
            "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
                        i, j);
+               return(1);
+           }
        }
 
        /*
@@ -102,10 +114,12 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
         * than 0x80, i.e. one of bits 5 to 1 of i must be set
         */
        else if ((i & 0x80) && ((i & 0x1E) == 0)) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
            "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
                        i, j);
+               return(1);
+           }
        }
 
        /*
@@ -113,10 +127,12 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
         * at least 3 bytes, but we give only 2 !
         */
        else if ((i & 0xE0) == 0xE0) {
-           if ((lastError == 0) || (res != NULL))
+           if ((lastError == 0) || (res != NULL)) {
                fprintf(stderr,
            "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n",
                        i, j);
+               return(1);
+           }
        }
 
        /*
@@ -125,11 +141,13 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
        else if ((lastError != 0) || (res == NULL)) {
            fprintf(stderr,
                "Failed to parse document for Bytes 0x%02X 0x%02X\n", i, j);
+           return(1);
        }
        if (res != NULL)
            xmlFreeDoc(res);
     }
     }
+    return(0);
 }
 
 /**
@@ -141,9 +159,10 @@ static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
  * CDATA in text or in attribute values.
  */
 
-static void testDocumentRanges(void) {
+static int testDocumentRanges(void) {
     xmlParserCtxtPtr ctxt;
     char *data;
+    int test_ret = 0;
 
     /*
      * Set up a parsing context using the first document as
@@ -152,7 +171,7 @@ static void testDocumentRanges(void) {
     ctxt = xmlNewParserCtxt();
     if (ctxt == NULL) {
         fprintf(stderr, "Failed to allocate parser context\n");
-       return;
+       return(1);
     }
 
     printf("testing 1 byte char in document: 1");
@@ -163,7 +182,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 1 byte injection at beginning of area */
-    testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
+    test_ret += testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
                            data, -1, -1);
     printf(" 2");
     fflush(stdout);
@@ -172,7 +191,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 1 byte injection at end of area */
-    testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
+    test_ret += testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
                            data + 3, -1, -1);
 
     printf(" 3");
@@ -183,7 +202,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 1 byte injection at beginning of area */
-    testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
+    test_ret += testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
                            data, '\'', -1);
     printf(" 4");
     fflush(stdout);
@@ -192,7 +211,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 1 byte injection at end of area */
-    testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
+    test_ret += testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
                            data + 3, '\'', -1);
     printf(" done\n");
 
@@ -204,7 +223,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 2 byte injection at beginning of area */
-    testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
+    test_ret += testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
                            data);
     printf(" 2");
     fflush(stdout);
@@ -213,7 +232,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 2 byte injection at end of area */
-    testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
+    test_ret += testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
                            data + 2);
 
     printf(" 3");
@@ -224,7 +243,7 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 2 byte injection at beginning of area */
-    testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
+    test_ret += testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
                            data);
     printf(" 4");
     fflush(stdout);
@@ -233,14 +252,15 @@ static void testDocumentRanges(void) {
     data[2] = ' ';
     data[3] = ' ';
     /* test 2 byte injection at end of area */
-    testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
+    test_ret += testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
                            data + 2);
     printf(" done\n");
 
     xmlFreeParserCtxt(ctxt);
+    return(test_ret);
 }
 
-static void testCharRangeByte1(xmlParserCtxtPtr ctxt, char *data) {
+static int testCharRangeByte1(xmlParserCtxtPtr ctxt, char *data) {
     int i = 0;
     int len, c;
 
@@ -255,19 +275,25 @@ static void testCharRangeByte1(xmlParserCtxtPtr ctxt, char *data) {
         c = xmlCurrentChar(ctxt, &len);
        if ((i == 0) || (i >= 0x80)) {
            /* we must see an error there */
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
                    "Failed to detect invalid char for Byte 0x%02X\n", i);
+               return(1);
+           }
        } else if (i == 0xD) {
-           if ((c != 0xA) || (len != 1))
+           if ((c != 0xA) || (len != 1)) {
                fprintf(stderr, "Failed to convert char for Byte 0x%02X\n", i);
+               return(1);
+           }
        } else if ((c != i) || (len != 1)) {
            fprintf(stderr, "Failed to parse char for Byte 0x%02X\n", i);
+           return(1);
        }
     }
+    return(0);
 }
 
-static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
+static int testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
     int i, j;
     int len, c;
 
@@ -284,10 +310,12 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
 
            /* if first bit of first char is set, then second bit must too */
            if ((i & 0x80) && ((i & 0x40) == 0)) {
-               if (lastError != XML_ERR_INVALID_CHAR)
+               if (lastError != XML_ERR_INVALID_CHAR) {
                    fprintf(stderr,
                    "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
                            i, j);
+                   return(1);
+               }
            }
 
            /*
@@ -295,10 +323,12 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
             * bits must be 10
             */
            else if ((i & 0x80) && ((j & 0xC0) != 0x80)) {
-               if (lastError != XML_ERR_INVALID_CHAR)
+               if (lastError != XML_ERR_INVALID_CHAR) {
                    fprintf(stderr,
                "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n",
                            i, j, c);
+                   return(1);
+               }
            }
 
            /*
@@ -306,10 +336,12 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
             * than 0x80, i.e. one of bits 5 to 1 of i must be set
             */
            else if ((i & 0x80) && ((i & 0x1E) == 0)) {
-               if (lastError != XML_ERR_INVALID_CHAR)
+               if (lastError != XML_ERR_INVALID_CHAR) {
                    fprintf(stderr,
                "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n",
                            i, j, c);
+                   return(1);
+               }
            }
 
            /*
@@ -317,10 +349,12 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
             * at least 3 bytes, but we give only 2 !
             */
            else if ((i & 0xE0) == 0xE0) {
-               if (lastError != XML_ERR_INVALID_CHAR)
+               if (lastError != XML_ERR_INVALID_CHAR) {
                    fprintf(stderr,
                "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n",
                            i, j);
+                   return(1);
+               }
            }
 
             /*
@@ -329,6 +363,7 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
            else if ((lastError != 0) || (len != 2)) {
                fprintf(stderr,
                    "Failed to parse char for Bytes 0x%02X 0x%02X\n", i, j);
+               return(1);
            }
 
             /*
@@ -338,12 +373,14 @@ static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
                fprintf(stderr,
        "Failed to parse char for Bytes 0x%02X 0x%02X: expect %d got %d\n",
                        i, j, ((j & 0x3F) + ((i & 0x1F) << 6)), c);
+               return(1);
            }
         }
     }
+    return(0);
 }
 
-static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
+static int testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
     int i, j, k, K;
     int len, c;
     unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF};
@@ -368,20 +405,24 @@ static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
         * at least 4 bytes, but we give only 3 !
         */
        if ((i & 0xF0) == 0xF0) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
                        i, j, K, data[3]);
+               return(1);
+           }
        }
 
         /*
         * The second and the third bytes must start with 10
         */
        else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80)) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n",
                        i, j, K);
+               return(1);
+           }
        }
 
        /*
@@ -390,10 +431,12 @@ static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
         * the 6th byte of data[1] must be set
         */
        else if (((i & 0xF) == 0) && ((j & 0x20) == 0)) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
            "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n",
                        i, j, K);
+               return(1);
+           }
        }
 
         /*
@@ -401,10 +444,12 @@ static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
         */
        else if (((value > 0xD7FF) && (value <0xE000)) ||
                 ((value > 0xFFFD) && (value <0x10000))) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
        "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X\n",
                        value, i, j, K);
+               return(1);
+           }
        }
 
        /*
@@ -414,6 +459,7 @@ static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
            fprintf(stderr,
                "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n",
                    i, j, K);
+           return(1);
        }
 
        /*
@@ -423,13 +469,15 @@ static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
            fprintf(stderr,
     "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n",
                i, j, data[2], value, c);
+           return(1);
        }
     }
     }
     }
+    return(0);
 }
 
-static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
+static int testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
     int i, j, k, K, l, L;
     int len, c;
     unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF};
@@ -458,10 +506,12 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
         * at least 5 bytes, but we give only 4 !
         */
        if ((i & 0xF8) == 0xF8) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
   "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
                        i, j, K, data[3]);
+               return(1);
+           }
        }
 
         /*
@@ -469,10 +519,12 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
         */
        else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80) ||
                 ((L & 0xC0) != 0x80)) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
                        i, j, K, L);
+               return(1);
+           }
        }
 
        /*
@@ -481,10 +533,12 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
         * the 6 or 5th byte of j must be set
         */
        else if (((i & 0x7) == 0) && ((j & 0x30) == 0)) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
                        i, j, K, L);
+               return(1);
+           }
        }
 
         /*
@@ -493,10 +547,12 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
        else if (((value > 0xD7FF) && (value <0xE000)) ||
                 ((value > 0xFFFD) && (value <0x10000)) ||
                 (value > 0x10FFFF)) {
-           if (lastError != XML_ERR_INVALID_CHAR)
+           if (lastError != XML_ERR_INVALID_CHAR) {
                fprintf(stderr,
 "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
                        value, i, j, K, L);
+               return(1);
+           }
        }
 
        /*
@@ -506,6 +562,7 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
            fprintf(stderr,
                "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n",
                    i, j, K);
+           return(1);
        }
 
        /*
@@ -515,11 +572,13 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
            fprintf(stderr,
     "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n",
                i, j, data[2], value, c);
+           return(1);
        }
     }
     }
     }
     }
+    return(0);
 }
 
 /**
@@ -530,11 +589,12 @@ static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
  * cover the full range of UTF-8 chars accepted by XML-1.0
  */
 
-static void testCharRanges(void) {
+static int testCharRanges(void) {
     char data[5];
     xmlParserCtxtPtr ctxt;
     xmlParserInputBufferPtr buf;
     xmlParserInputPtr input;
+    int test_ret = 0;
 
     memset(data, 0, 5);
 
@@ -545,17 +605,19 @@ static void testCharRanges(void) {
     ctxt = xmlNewParserCtxt();
     if (ctxt == NULL) {
         fprintf(stderr, "Failed to allocate parser context\n");
-       return;
+       return(1);
     }
     buf = xmlParserInputBufferCreateStatic(data, sizeof(data),
                                            XML_CHAR_ENCODING_NONE);
     if (buf == NULL) {
         fprintf(stderr, "Failed to allocate input buffer\n");
+       test_ret = 1;
        goto error;
     }
     input = xmlNewInputStream(ctxt);
     if (input == NULL) {
         xmlFreeParserInputBuffer(buf);
+       test_ret = 1;
        goto error;
     }
     input->filename = NULL;
@@ -567,25 +629,28 @@ static void testCharRanges(void) {
 
     printf("testing char range: 1");
     fflush(stdout);
-    testCharRangeByte1(ctxt, data);
+    test_ret += testCharRangeByte1(ctxt, data);
     printf(" 2");
     fflush(stdout);
-    testCharRangeByte2(ctxt, data);
+    test_ret += testCharRangeByte2(ctxt, data);
     printf(" 3");
     fflush(stdout);
-    testCharRangeByte3(ctxt, data);
+    test_ret += testCharRangeByte3(ctxt, data);
     printf(" 4");
     fflush(stdout);
-    testCharRangeByte4(ctxt, data);
+    test_ret += testCharRangeByte4(ctxt, data);
     printf(" done\n");
     fflush(stdout);
 
 error:
     xmlFreeParserCtxt(ctxt);
+    return(test_ret);
 }
 
 int main(void) {
 
+    int ret = 0;
+
     /*
      * this initialize the library and check potential ABI mismatches
      * between the version it was compiled for and the actual shared
@@ -602,8 +667,8 @@ int main(void) {
     /*
      * Run the tests
      */
-    testCharRanges();
-    testDocumentRanges();
+    ret += testCharRanges();
+    ret += testDocumentRanges();
 
     /*
      * Cleanup function for the XML library.
@@ -613,5 +678,5 @@ int main(void) {
      * this is to debug memory for regression tests
      */
     xmlMemoryDump();
-    return(0);
+    return(ret ? 1 : 0);
 }


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