1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-10-23 01:52:48 +03:00

Make testchar return an error on failure

This commit is contained in:
Tony Tascioglu
2022-04-03 17:54:23 +02:00
committed by Nick Wellnhofer
parent 0e9776b070
commit 41a1943057

View File

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