1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-03-19 14:50:07 +03:00

Add more checks for malloc failures in xmllint.c

Also fix a few of the existing checks.

Fixes #197.
Fixes #198.
This commit is contained in:
Nick Wellnhofer 2022-02-01 15:56:21 +01:00
parent eab8652216
commit 18d1f9d42a

112
xmllint.c
View File

@ -1659,6 +1659,11 @@ testSAX(const char *filename) {
xmlSchemaValidCtxtPtr vctxt;
vctxt = xmlSchemaNewValidCtxt(wxschemas);
if (vctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
xmlFreeParserInputBuffer(buf);
goto error;
}
xmlSchemaSetValidErrors(vctxt, xmlGenericError, xmlGenericError, NULL);
xmlSchemaValidateSetFilename(vctxt, filename);
@ -1687,6 +1692,7 @@ testSAX(const char *filename) {
*/
ctxt = xmlNewParserCtxt();
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
xmlFreeParserInputBuffer(buf);
goto error;
}
@ -2213,6 +2219,12 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
if (res > 0) {
ctxt = htmlCreatePushParserCtxt(NULL, NULL,
chars, res, filename, XML_CHAR_ENCODING_NONE);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
if (f != stdin)
fclose(f);
return;
}
htmlCtxtUseOptions(ctxt, options);
while ((res = fread(chars, 1, pushsize, f)) > 0) {
htmlParseChunk(ctxt, chars, res, 0);
@ -2221,7 +2233,8 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
doc = ctxt->myDoc;
htmlFreeParserCtxt(ctxt);
}
fclose(f);
if (f != stdin)
fclose(f);
}
}
#endif /* LIBXML_PUSH_ENABLED */
@ -2284,6 +2297,12 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
if (res > 0) {
ctxt = xmlCreatePushParserCtxt(NULL, NULL,
chars, res, filename);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
if (f != stdin)
fclose(f);
return;
}
xmlCtxtUseOptions(ctxt, options);
while ((res = fread(chars, 1, size, f)) > 0) {
xmlParseChunk(ctxt, chars, res, 0);
@ -2328,23 +2347,25 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
} else if (htmlout) {
xmlParserCtxtPtr ctxt;
if (rectxt == NULL)
if (rectxt == NULL) {
ctxt = xmlNewParserCtxt();
else
ctxt = rectxt;
if (ctxt == NULL) {
doc = NULL;
} else {
ctxt->sax->error = xmlHTMLError;
ctxt->sax->warning = xmlHTMLWarning;
ctxt->vctxt.error = xmlHTMLValidityError;
ctxt->vctxt.warning = xmlHTMLValidityWarning;
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
return;
}
} else {
ctxt = rectxt;
}
doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
ctxt->sax->error = xmlHTMLError;
ctxt->sax->warning = xmlHTMLWarning;
ctxt->vctxt.error = xmlHTMLValidityError;
ctxt->vctxt.warning = xmlHTMLValidityWarning;
if (rectxt == NULL)
xmlFreeParserCtxt(ctxt);
}
doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
if (rectxt == NULL)
xmlFreeParserCtxt(ctxt);
#ifdef HAVE_MMAP
} else if (memory) {
int fd;
@ -2376,20 +2397,22 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
} else if (valid) {
xmlParserCtxtPtr ctxt = NULL;
if (rectxt == NULL)
if (rectxt == NULL) {
ctxt = xmlNewParserCtxt();
else
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
return;
}
} else {
ctxt = rectxt;
if (ctxt == NULL) {
doc = NULL;
} else {
doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
}
if (ctxt->valid == 0)
progresult = XMLLINT_ERR_RDFILE;
if (rectxt == NULL)
xmlFreeParserCtxt(ctxt);
}
doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
if (ctxt->valid == 0)
progresult = XMLLINT_ERR_RDFILE;
if (rectxt == NULL)
xmlFreeParserCtxt(ctxt);
#endif /* LIBXML_VALID_ENABLED */
} else {
if (rectxt != NULL)
@ -2771,7 +2794,9 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
if ((cvp = xmlNewValidCtxt()) == NULL) {
xmlGenericError(xmlGenericErrorContext,
"Couldn't allocate validation context\n");
exit(-1);
progresult = XMLLINT_ERR_MEM;
xmlFreeDtd(dtd);
return;
}
cvp->userData = NULL;
cvp->error = xmlGenericError;
@ -2803,7 +2828,9 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
if ((cvp = xmlNewValidCtxt()) == NULL) {
xmlGenericError(xmlGenericErrorContext,
"Couldn't allocate validation context\n");
exit(-1);
progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
if ((timing) && (!repeat)) {
@ -2840,6 +2867,11 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
if (noout)
flag |= XML_SCHEMATRON_OUT_QUIET;
ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
#if 0
xmlSchematronSetValidErrors(ctxt, xmlGenericError, xmlGenericError,
NULL);
@ -2873,6 +2905,11 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
}
ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
xmlRelaxNGSetValidErrors(ctxt, xmlGenericError, xmlGenericError, NULL);
ret = xmlRelaxNGValidateDoc(ctxt, doc);
if (ret == 0) {
@ -2900,6 +2937,11 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
}
ctxt = xmlSchemaNewValidCtxt(wxschemas);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
xmlSchemaSetValidErrors(ctxt, xmlGenericError, xmlGenericError, NULL);
ret = xmlSchemaValidateDoc(ctxt, doc);
if (ret == 0) {
@ -3581,6 +3623,10 @@ main(int argc, char **argv) {
startTimer();
}
ctxt = xmlSchematronNewParserCtxt(schematron);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
goto error;
}
#if 0
xmlSchematronSetParserErrors(ctxt, xmlGenericError, xmlGenericError,
NULL);
@ -3613,6 +3659,10 @@ main(int argc, char **argv) {
startTimer();
}
ctxt = xmlRelaxNGNewParserCtxt(relaxng);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
goto error;
}
xmlRelaxNGSetParserErrors(ctxt, xmlGenericError, xmlGenericError,
NULL);
relaxngschemas = xmlRelaxNGParse(ctxt);
@ -3637,6 +3687,10 @@ main(int argc, char **argv) {
startTimer();
}
ctxt = xmlSchemaNewParserCtxt(schema);
if (ctxt == NULL) {
progresult = XMLLINT_ERR_MEM;
goto error;
}
xmlSchemaSetParserErrors(ctxt, xmlGenericError, xmlGenericError, NULL);
wxschemas = xmlSchemaParse(ctxt);
if (wxschemas == NULL) {
@ -3804,6 +3858,8 @@ main(int argc, char **argv) {
if (patternc != NULL)
xmlFreePattern(patternc);
#endif
error:
xmlCleanupParser();
xmlMemoryDump();