mirror of
				https://gitlab.gnome.org/GNOME/libxml2.git
				synced 2025-10-30 10:45:36 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * html.c: a libFuzzer target to test several HTML parser interfaces.
 | |
|  *
 | |
|  * See Copyright for the status of this software.
 | |
|  */
 | |
| 
 | |
| #include <libxml/HTMLparser.h>
 | |
| #include <libxml/HTMLtree.h>
 | |
| #include <libxml/catalog.h>
 | |
| #include "fuzz.h"
 | |
| 
 | |
| int
 | |
| LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
 | |
|                      char ***argv ATTRIBUTE_UNUSED) {
 | |
|     xmlInitParser();
 | |
| #ifdef LIBXML_CATALOG_ENABLED
 | |
|     xmlInitializeCatalog();
 | |
| #endif
 | |
|     xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| int
 | |
| LLVMFuzzerTestOneInput(const char *data, size_t size) {
 | |
|     static const size_t maxChunkSize = 128;
 | |
|     htmlDocPtr doc;
 | |
|     htmlParserCtxtPtr ctxt;
 | |
|     xmlOutputBufferPtr out;
 | |
|     const char *docBuffer;
 | |
|     size_t docSize, consumed, chunkSize;
 | |
|     int opts;
 | |
| 
 | |
|     xmlFuzzDataInit(data, size);
 | |
|     opts = xmlFuzzReadInt();
 | |
| 
 | |
|     docBuffer = xmlFuzzReadRemaining(&docSize);
 | |
|     if (docBuffer == NULL) {
 | |
|         xmlFuzzDataCleanup();
 | |
|         return(0);
 | |
|     }
 | |
| 
 | |
|     /* Pull parser */
 | |
| 
 | |
|     doc = htmlReadMemory(docBuffer, docSize, NULL, NULL, opts);
 | |
| 
 | |
|     /*
 | |
|      * Also test the serializer. Call htmlDocContentDumpOutput with our
 | |
|      * own buffer to avoid encoding the output. The HTML encoding is
 | |
|      * excruciatingly slow (see htmlEntityValueLookup).
 | |
|      */
 | |
|     out = xmlAllocOutputBuffer(NULL);
 | |
|     htmlDocContentDumpOutput(out, doc, NULL);
 | |
|     xmlOutputBufferClose(out);
 | |
| 
 | |
|     xmlFreeDoc(doc);
 | |
| 
 | |
|     /* Push parser */
 | |
| 
 | |
|     ctxt = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL,
 | |
|                                     XML_CHAR_ENCODING_NONE);
 | |
|     htmlCtxtUseOptions(ctxt, opts);
 | |
| 
 | |
|     for (consumed = 0; consumed < docSize; consumed += chunkSize) {
 | |
|         chunkSize = docSize - consumed;
 | |
|         if (chunkSize > maxChunkSize)
 | |
|             chunkSize = maxChunkSize;
 | |
|         htmlParseChunk(ctxt, docBuffer + consumed, chunkSize, 0);
 | |
|     }
 | |
| 
 | |
|     htmlParseChunk(ctxt, NULL, 0, 1);
 | |
|     xmlFreeDoc(ctxt->myDoc);
 | |
|     htmlFreeParserCtxt(ctxt);
 | |
| 
 | |
|     /* Cleanup */
 | |
| 
 | |
|     xmlFuzzDataCleanup();
 | |
|     xmlResetLastError();
 | |
| 
 | |
|     return(0);
 | |
| }
 | |
| 
 |