xref: /aosp_15_r20/external/libxml2/fuzz/xpath.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * xpath.c: a libFuzzer target to test XPath and XPointer expressions.
3*7c568831SAndroid Build Coastguard Worker  *
4*7c568831SAndroid Build Coastguard Worker  * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker  */
6*7c568831SAndroid Build Coastguard Worker 
7*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
8*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
9*7c568831SAndroid Build Coastguard Worker #include <libxml/xpointer.h>
10*7c568831SAndroid Build Coastguard Worker #include "fuzz.h"
11*7c568831SAndroid Build Coastguard Worker 
12*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerInitialize(int * argc ATTRIBUTE_UNUSED,char *** argv ATTRIBUTE_UNUSED)13*7c568831SAndroid Build Coastguard Worker LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
14*7c568831SAndroid Build Coastguard Worker                      char ***argv ATTRIBUTE_UNUSED) {
15*7c568831SAndroid Build Coastguard Worker     xmlFuzzMemSetup();
16*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
17*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
18*7c568831SAndroid Build Coastguard Worker     xmlInitializeCatalog();
19*7c568831SAndroid Build Coastguard Worker     xmlCatalogSetDefaults(XML_CATA_ALLOW_NONE);
20*7c568831SAndroid Build Coastguard Worker #endif
21*7c568831SAndroid Build Coastguard Worker     xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
22*7c568831SAndroid Build Coastguard Worker 
23*7c568831SAndroid Build Coastguard Worker     return 0;
24*7c568831SAndroid Build Coastguard Worker }
25*7c568831SAndroid Build Coastguard Worker 
26*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerTestOneInput(const char * data,size_t size)27*7c568831SAndroid Build Coastguard Worker LLVMFuzzerTestOneInput(const char *data, size_t size) {
28*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
29*7c568831SAndroid Build Coastguard Worker     const char *expr, *xml;
30*7c568831SAndroid Build Coastguard Worker     size_t maxAlloc, exprSize, xmlSize;
31*7c568831SAndroid Build Coastguard Worker 
32*7c568831SAndroid Build Coastguard Worker     if (size > 10000)
33*7c568831SAndroid Build Coastguard Worker         return(0);
34*7c568831SAndroid Build Coastguard Worker 
35*7c568831SAndroid Build Coastguard Worker     xmlFuzzDataInit(data, size);
36*7c568831SAndroid Build Coastguard Worker 
37*7c568831SAndroid Build Coastguard Worker     maxAlloc = xmlFuzzReadInt(4) % (size + 100);
38*7c568831SAndroid Build Coastguard Worker     expr = xmlFuzzReadString(&exprSize);
39*7c568831SAndroid Build Coastguard Worker     xml = xmlFuzzReadString(&xmlSize);
40*7c568831SAndroid Build Coastguard Worker 
41*7c568831SAndroid Build Coastguard Worker     /* Recovery mode allows more input to be fuzzed. */
42*7c568831SAndroid Build Coastguard Worker     doc = xmlReadMemory(xml, xmlSize, NULL, NULL, XML_PARSE_RECOVER);
43*7c568831SAndroid Build Coastguard Worker     if (doc != NULL) {
44*7c568831SAndroid Build Coastguard Worker         xmlXPathContextPtr xpctxt;
45*7c568831SAndroid Build Coastguard Worker 
46*7c568831SAndroid Build Coastguard Worker         xmlFuzzMemSetLimit(maxAlloc);
47*7c568831SAndroid Build Coastguard Worker 
48*7c568831SAndroid Build Coastguard Worker         xpctxt = xmlXPathNewContext(doc);
49*7c568831SAndroid Build Coastguard Worker         if (xpctxt != NULL) {
50*7c568831SAndroid Build Coastguard Worker             int res;
51*7c568831SAndroid Build Coastguard Worker 
52*7c568831SAndroid Build Coastguard Worker             /* Operation limit to avoid timeout */
53*7c568831SAndroid Build Coastguard Worker             xpctxt->opLimit = 500000;
54*7c568831SAndroid Build Coastguard Worker 
55*7c568831SAndroid Build Coastguard Worker             res = xmlXPathContextSetCache(xpctxt, 1, 4, 0);
56*7c568831SAndroid Build Coastguard Worker             xmlFuzzCheckMallocFailure("xmlXPathContextSetCache", res == -1);
57*7c568831SAndroid Build Coastguard Worker 
58*7c568831SAndroid Build Coastguard Worker             xmlFuzzResetMallocFailed();
59*7c568831SAndroid Build Coastguard Worker             xmlXPathFreeObject(xmlXPtrEval(BAD_CAST expr, xpctxt));
60*7c568831SAndroid Build Coastguard Worker             xmlFuzzCheckMallocFailure("xmlXPtrEval",
61*7c568831SAndroid Build Coastguard Worker                                       xpctxt->lastError.code ==
62*7c568831SAndroid Build Coastguard Worker                                       XML_ERR_NO_MEMORY);
63*7c568831SAndroid Build Coastguard Worker             xmlXPathFreeContext(xpctxt);
64*7c568831SAndroid Build Coastguard Worker         }
65*7c568831SAndroid Build Coastguard Worker 
66*7c568831SAndroid Build Coastguard Worker         xmlFuzzMemSetLimit(0);
67*7c568831SAndroid Build Coastguard Worker         xmlFreeDoc(doc);
68*7c568831SAndroid Build Coastguard Worker     }
69*7c568831SAndroid Build Coastguard Worker 
70*7c568831SAndroid Build Coastguard Worker     xmlFuzzDataCleanup();
71*7c568831SAndroid Build Coastguard Worker     xmlResetLastError();
72*7c568831SAndroid Build Coastguard Worker 
73*7c568831SAndroid Build Coastguard Worker     return(0);
74*7c568831SAndroid Build Coastguard Worker }
75*7c568831SAndroid Build Coastguard Worker 
76