mirror of
				https://gitlab.gnome.org/GNOME/libxml2.git
				synced 2025-10-30 10:45:36 +03:00 
			
		
		
		
	xmllint: Switch to resource loader
This commit is contained in:
		| @@ -198,12 +198,11 @@ LLVMFuzzerTestOneInput(const char *data, size_t size) { | ||||
|     pushArg(NULL); | ||||
|  | ||||
|     xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc); | ||||
|     xmlSetExternalEntityLoader(xmlFuzzEntityLoader); | ||||
| #ifdef LIBXML_CATALOG_ENABLED | ||||
|     xmlCatalogSetDefaults(XML_CATA_ALLOW_NONE); | ||||
| #endif | ||||
|  | ||||
|     xmllintMain(vars.argi - 1, vars.argv); | ||||
|     xmllintMain(vars.argi - 1, vars.argv, xmlFuzzResourceLoader); | ||||
|  | ||||
|     xmlMemSetup(free, malloc, realloc, xmlMemStrdup); | ||||
|  | ||||
|   | ||||
							
								
								
									
										117
									
								
								xmllint.c
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								xmllint.c
									
									
									
									
									
								
							| @@ -224,15 +224,13 @@ void parsePath(const xmlChar *path) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| static xmlExternalEntityLoader defaultEntityLoader = NULL; | ||||
|  | ||||
| static xmlParserInputPtr | ||||
| xmllintExternalEntityLoader(const char *URL, const char *ID, | ||||
| 			     xmlParserCtxtPtr ctxt) { | ||||
|     xmlParserInputPtr ret; | ||||
|     warningSAXFunc warning = NULL; | ||||
|     errorSAXFunc err = NULL; | ||||
| static xmlResourceLoader defaultResourceLoader = NULL; | ||||
|  | ||||
| static int | ||||
| xmllintResourceLoader(void *ctxt ATTRIBUTE_UNUSED, const char *URL, | ||||
|                       const char *ID, int type, int flags, | ||||
| 		      xmlParserInputPtr *out) { | ||||
|     int code; | ||||
|     int i; | ||||
|     const char *lastsegment = URL; | ||||
|     const char *iter = URL; | ||||
| @@ -245,30 +243,18 @@ xmllintExternalEntityLoader(const char *URL, const char *ID, | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     if ((ctxt != NULL) && (ctxt->sax != NULL)) { | ||||
| 	warning = ctxt->sax->warning; | ||||
| 	err = ctxt->sax->error; | ||||
| 	ctxt->sax->warning = NULL; | ||||
| 	ctxt->sax->error = NULL; | ||||
|     if (defaultResourceLoader != NULL) | ||||
|         code = defaultResourceLoader(NULL, URL, ID, type, flags, out); | ||||
|     else | ||||
|         code = xmlInputCreateUrl(URL, flags, out); | ||||
|     if (code != XML_IO_ENOENT) { | ||||
|         if ((load_trace) && (code == XML_ERR_OK)) { | ||||
|             fprintf(ERR_STREAM, "Loaded URL=\"%s\" ID=\"%s\"\n", | ||||
|                     URL, ID ? ID : "(null)"); | ||||
|         } | ||||
|         return(code); | ||||
|     } | ||||
|  | ||||
|     if (defaultEntityLoader != NULL) { | ||||
| 	ret = defaultEntityLoader(URL, ID, ctxt); | ||||
| 	if (ret != NULL) { | ||||
| 	    if (warning != NULL) | ||||
| 		ctxt->sax->warning = warning; | ||||
| 	    if (err != NULL) | ||||
| 		ctxt->sax->error = err; | ||||
| 	    if (load_trace) { | ||||
| 		fprintf \ | ||||
| 			(ERR_STREAM, | ||||
| 			 "Loaded URL=\"%s\" ID=\"%s\"\n", | ||||
| 			 URL ? URL : "(null)", | ||||
| 			 ID ? ID : "(null)"); | ||||
| 	    } | ||||
| 	    return(ret); | ||||
| 	} | ||||
|     } | ||||
|     for (i = 0; i < nbpaths; i++) { | ||||
| 	xmlChar *newURL; | ||||
|  | ||||
| @@ -276,35 +262,24 @@ xmllintExternalEntityLoader(const char *URL, const char *ID, | ||||
| 	newURL = xmlStrcat(newURL, (const xmlChar *) "/"); | ||||
| 	newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment); | ||||
| 	if (newURL != NULL) { | ||||
| 	    ret = defaultEntityLoader((const char *)newURL, ID, ctxt); | ||||
| 	    if (ret != NULL) { | ||||
| 		if (warning != NULL) | ||||
| 		    ctxt->sax->warning = warning; | ||||
| 		if (err != NULL) | ||||
| 		    ctxt->sax->error = err; | ||||
| 		if (load_trace) { | ||||
| 		    fprintf \ | ||||
| 			(ERR_STREAM, | ||||
| 			 "Loaded URL=\"%s\" ID=\"%s\"\n", | ||||
| 			 newURL, | ||||
| 			 ID ? ID : "(null)"); | ||||
|             if (defaultResourceLoader != NULL) | ||||
|                 code = defaultResourceLoader(NULL, (const char *) newURL, ID, | ||||
|                                              type, flags, out); | ||||
|             else | ||||
|                 code = xmlInputCreateUrl((const char *) newURL, flags, out); | ||||
|             if (code != XML_IO_ENOENT) { | ||||
|                 if ((load_trace) && (code == XML_ERR_OK)) { | ||||
|                     fprintf(ERR_STREAM, "Loaded URL=\"%s\" ID=\"%s\"\n", | ||||
|                             newURL, ID ? ID : "(null)"); | ||||
|                 } | ||||
| 	        xmlFree(newURL); | ||||
| 		return(ret); | ||||
|                 return(code); | ||||
|             } | ||||
| 	    xmlFree(newURL); | ||||
| 	} | ||||
|     } | ||||
|     if (err != NULL) | ||||
|         ctxt->sax->error = err; | ||||
|     if (warning != NULL) { | ||||
| 	ctxt->sax->warning = warning; | ||||
| 	if (URL != NULL) | ||||
| 	    warning(ctxt, "failed to load external entity \"%s\"\n", URL); | ||||
| 	else if (ID != NULL) | ||||
| 	    warning(ctxt, "failed to load external entity \"%s\"\n", ID); | ||||
|     } | ||||
|     return(NULL); | ||||
|  | ||||
|     return(XML_IO_ENOENT); | ||||
| } | ||||
|  | ||||
| /************************************************************************ | ||||
| @@ -1644,6 +1619,8 @@ testSAX(const char *filename) { | ||||
|             progresult = XMLLINT_ERR_MEM; | ||||
| 	    return; | ||||
| 	} | ||||
|  | ||||
|         xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
|         if (maxAmpl > 0) | ||||
|             xmlCtxtSetMaxAmplification(ctxt, maxAmpl); | ||||
|  | ||||
| @@ -1803,8 +1780,10 @@ static void streamFile(const char *filename) { | ||||
|  | ||||
|  | ||||
|     if (reader != NULL) { | ||||
|         xmlTextReaderSetResourceLoader(reader, xmllintResourceLoader, NULL); | ||||
|         if (maxAmpl > 0) | ||||
|             xmlTextReaderSetMaxAmplification(reader, maxAmpl); | ||||
|  | ||||
| #ifdef LIBXML_SCHEMAS_ENABLED | ||||
| 	if (relaxng != NULL) { | ||||
| 	    if ((timing) && (!repeat)) { | ||||
| @@ -2213,10 +2192,15 @@ parseFile(const char *filename, xmlParserCtxtPtr rectxt) { | ||||
| #endif | ||||
|  | ||||
|     if (html) { | ||||
|         ctxt = htmlNewParserCtxt(); | ||||
|         xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
|  | ||||
|         if (strcmp(filename, "-") == 0) | ||||
|             doc = htmlReadFd(STDIN_FILENO, "-", NULL, options); | ||||
|             doc = htmlCtxtReadFd(ctxt, STDIN_FILENO, "-", NULL, options); | ||||
|         else | ||||
|             doc = htmlReadFile(filename, NULL, options); | ||||
|             doc = htmlCtxtReadFile(ctxt, filename, NULL, options); | ||||
|  | ||||
|         htmlFreeParserCtxt(ctxt); | ||||
|  | ||||
|         return(doc); | ||||
|     } | ||||
| @@ -2248,8 +2232,9 @@ parseFile(const char *filename, xmlParserCtxtPtr rectxt) { | ||||
|                 fclose(f); | ||||
|             return(NULL); | ||||
|         } | ||||
|         xmlCtxtUseOptions(ctxt, options); | ||||
|  | ||||
|         xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
|         xmlCtxtUseOptions(ctxt, options); | ||||
|         if (maxAmpl > 0) | ||||
|             xmlCtxtSetMaxAmplification(ctxt, maxAmpl); | ||||
|  | ||||
| @@ -2281,6 +2266,7 @@ parseFile(const char *filename, xmlParserCtxtPtr rectxt) { | ||||
|             ctxt = rectxt; | ||||
|         } | ||||
|  | ||||
|         xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
|         if (maxAmpl > 0) | ||||
|             xmlCtxtSetMaxAmplification(ctxt, maxAmpl); | ||||
|  | ||||
| @@ -3109,7 +3095,7 @@ skipArgs(const char *arg) { | ||||
| } | ||||
|  | ||||
| static int | ||||
| xmllintMain(int argc, const char **argv) { | ||||
| xmllintMain(int argc, const char **argv, xmlResourceLoader loader) { | ||||
|     int i, acount; | ||||
|     int files = 0; | ||||
|     int version = 0; | ||||
| @@ -3123,6 +3109,8 @@ xmllintMain(int argc, const char **argv) { | ||||
|     int nocatalogs = 0; | ||||
| #endif | ||||
|  | ||||
|     defaultResourceLoader = loader; | ||||
|  | ||||
| #ifdef XMLLINT_FUZZ | ||||
| #ifdef LIBXML_DEBUG_ENABLED | ||||
|     shell = 0; | ||||
| @@ -3196,7 +3184,6 @@ xmllintMain(int argc, const char **argv) { | ||||
| #endif | ||||
|     options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES; | ||||
|     maxAmpl = 0; | ||||
|     defaultEntityLoader = NULL; | ||||
| #endif /* XMLLINT_FUZZ */ | ||||
|  | ||||
|     if (argc <= 1) { | ||||
| @@ -3512,9 +3499,6 @@ xmllintMain(int argc, const char **argv) { | ||||
|         else if ((!strcmp(argv[i], "-nonet")) || | ||||
|                    (!strcmp(argv[i], "--nonet"))) { | ||||
| 	    options |= XML_PARSE_NONET; | ||||
| #ifndef XMLLINT_FUZZ | ||||
| 	    xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader); | ||||
| #endif | ||||
|         } else if ((!strcmp(argv[i], "-nocompact")) || | ||||
|                    (!strcmp(argv[i], "--nocompact"))) { | ||||
| 	    options &= ~XML_PARSE_COMPACT; | ||||
| @@ -3576,9 +3560,6 @@ xmllintMain(int argc, const char **argv) { | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     defaultEntityLoader = xmlGetExternalEntityLoader(); | ||||
|     xmlSetExternalEntityLoader(xmllintExternalEntityLoader); | ||||
|  | ||||
|     if ((htmlout) && (!nowrap)) { | ||||
| 	fprintf(ERR_STREAM, | ||||
|          "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n"); | ||||
| @@ -3641,6 +3622,7 @@ xmllintMain(int argc, const char **argv) { | ||||
|             progresult = XMLLINT_ERR_MEM; | ||||
|             goto error; | ||||
|         } | ||||
|         xmlRelaxNGSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
| 	relaxngschemas = xmlRelaxNGParse(ctxt); | ||||
| 	if (relaxngschemas == NULL) { | ||||
| 	    fprintf(ERR_STREAM, | ||||
| @@ -3667,6 +3649,7 @@ xmllintMain(int argc, const char **argv) { | ||||
|             progresult = XMLLINT_ERR_MEM; | ||||
|             goto error; | ||||
|         } | ||||
|         xmlSchemaSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
| 	wxschemas = xmlSchemaParse(ctxt); | ||||
| 	if (wxschemas == NULL) { | ||||
| 	    fprintf(ERR_STREAM, | ||||
| @@ -3706,6 +3689,8 @@ xmllintMain(int argc, const char **argv) { | ||||
|                 progresult = XMLLINT_ERR_MEM; | ||||
|                 goto error; | ||||
|             } | ||||
|  | ||||
|             xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL); | ||||
|             if (maxAmpl > 0) | ||||
|                 xmlCtxtSetMaxAmplification(ctxt, maxAmpl); | ||||
|  | ||||
| @@ -3771,8 +3756,6 @@ xmllintMain(int argc, const char **argv) { | ||||
|     goto error; | ||||
|  | ||||
| error: | ||||
|     if (defaultEntityLoader != NULL) | ||||
|         xmlSetExternalEntityLoader(defaultEntityLoader); | ||||
|     xmlCleanupParser(); | ||||
|  | ||||
|     return(progresult); | ||||
| @@ -3781,7 +3764,7 @@ error: | ||||
| #ifndef XMLLINT_FUZZ | ||||
| int | ||||
| main(int argc, char **argv) { | ||||
|     return(xmllintMain(argc, (const char **) argv)); | ||||
|     return(xmllintMain(argc, (const char **) argv, NULL)); | ||||
| } | ||||
| #endif | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user