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