1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * uri.c: a libFuzzer target to test the URI module.
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/uri.h>
8*7c568831SAndroid Build Coastguard Worker #include "fuzz.h"
9*7c568831SAndroid Build Coastguard Worker
10*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerInitialize(int * argc ATTRIBUTE_UNUSED,char *** argv ATTRIBUTE_UNUSED)11*7c568831SAndroid Build Coastguard Worker LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
12*7c568831SAndroid Build Coastguard Worker char ***argv ATTRIBUTE_UNUSED) {
13*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetup();
14*7c568831SAndroid Build Coastguard Worker
15*7c568831SAndroid Build Coastguard Worker return 0;
16*7c568831SAndroid Build Coastguard Worker }
17*7c568831SAndroid Build Coastguard Worker
18*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerTestOneInput(const char * data,size_t size)19*7c568831SAndroid Build Coastguard Worker LLVMFuzzerTestOneInput(const char *data, size_t size) {
20*7c568831SAndroid Build Coastguard Worker xmlURIPtr uri;
21*7c568831SAndroid Build Coastguard Worker size_t maxAlloc;
22*7c568831SAndroid Build Coastguard Worker const char *str1, *str2;
23*7c568831SAndroid Build Coastguard Worker char *copy;
24*7c568831SAndroid Build Coastguard Worker xmlChar *strRes;
25*7c568831SAndroid Build Coastguard Worker int intRes;
26*7c568831SAndroid Build Coastguard Worker
27*7c568831SAndroid Build Coastguard Worker if (size > 10000)
28*7c568831SAndroid Build Coastguard Worker return(0);
29*7c568831SAndroid Build Coastguard Worker
30*7c568831SAndroid Build Coastguard Worker xmlFuzzDataInit(data, size);
31*7c568831SAndroid Build Coastguard Worker maxAlloc = xmlFuzzReadInt(4) % (size * 8 + 100);
32*7c568831SAndroid Build Coastguard Worker str1 = xmlFuzzReadString(NULL);
33*7c568831SAndroid Build Coastguard Worker str2 = xmlFuzzReadString(NULL);
34*7c568831SAndroid Build Coastguard Worker
35*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetLimit(maxAlloc);
36*7c568831SAndroid Build Coastguard Worker
37*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
38*7c568831SAndroid Build Coastguard Worker intRes = xmlParseURISafe(str1, &uri);
39*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlParseURISafe", intRes == -1);
40*7c568831SAndroid Build Coastguard Worker
41*7c568831SAndroid Build Coastguard Worker if (uri != NULL) {
42*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
43*7c568831SAndroid Build Coastguard Worker strRes = xmlSaveUri(uri);
44*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlSaveURI", strRes == NULL);
45*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
46*7c568831SAndroid Build Coastguard Worker xmlFreeURI(uri);
47*7c568831SAndroid Build Coastguard Worker }
48*7c568831SAndroid Build Coastguard Worker
49*7c568831SAndroid Build Coastguard Worker xmlFreeURI(xmlParseURI(str1));
50*7c568831SAndroid Build Coastguard Worker
51*7c568831SAndroid Build Coastguard Worker uri = xmlParseURIRaw(str1, 1);
52*7c568831SAndroid Build Coastguard Worker xmlFree(xmlSaveUri(uri));
53*7c568831SAndroid Build Coastguard Worker xmlFreeURI(uri);
54*7c568831SAndroid Build Coastguard Worker
55*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
56*7c568831SAndroid Build Coastguard Worker strRes = BAD_CAST xmlURIUnescapeString(str1, -1, NULL);
57*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlURIUnescapeString",
58*7c568831SAndroid Build Coastguard Worker str1 != NULL && strRes == NULL);
59*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
60*7c568831SAndroid Build Coastguard Worker
61*7c568831SAndroid Build Coastguard Worker xmlFree(xmlURIEscape(BAD_CAST str1));
62*7c568831SAndroid Build Coastguard Worker
63*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
64*7c568831SAndroid Build Coastguard Worker strRes = xmlCanonicPath(BAD_CAST str1);
65*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlCanonicPath",
66*7c568831SAndroid Build Coastguard Worker str1 != NULL && strRes == NULL);
67*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
68*7c568831SAndroid Build Coastguard Worker
69*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
70*7c568831SAndroid Build Coastguard Worker strRes = xmlPathToURI(BAD_CAST str1);
71*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlPathToURI", str1 != NULL && strRes == NULL);
72*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
73*7c568831SAndroid Build Coastguard Worker
74*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
75*7c568831SAndroid Build Coastguard Worker intRes = xmlBuildURISafe(BAD_CAST str2, BAD_CAST str1, &strRes);
76*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlBuildURISafe", intRes == -1);
77*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
78*7c568831SAndroid Build Coastguard Worker
79*7c568831SAndroid Build Coastguard Worker xmlFree(xmlBuildURI(BAD_CAST str2, BAD_CAST str1));
80*7c568831SAndroid Build Coastguard Worker
81*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
82*7c568831SAndroid Build Coastguard Worker intRes = xmlBuildRelativeURISafe(BAD_CAST str2, BAD_CAST str1, &strRes);
83*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlBuildRelativeURISafe", intRes == -1);
84*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
85*7c568831SAndroid Build Coastguard Worker
86*7c568831SAndroid Build Coastguard Worker xmlFree(xmlBuildRelativeURI(BAD_CAST str2, BAD_CAST str1));
87*7c568831SAndroid Build Coastguard Worker
88*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
89*7c568831SAndroid Build Coastguard Worker strRes = xmlURIEscapeStr(BAD_CAST str1, BAD_CAST str2);
90*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure("xmlURIEscapeStr",
91*7c568831SAndroid Build Coastguard Worker str1 != NULL && strRes == NULL);
92*7c568831SAndroid Build Coastguard Worker xmlFree(strRes);
93*7c568831SAndroid Build Coastguard Worker
94*7c568831SAndroid Build Coastguard Worker copy = (char *) xmlCharStrdup(str1);
95*7c568831SAndroid Build Coastguard Worker xmlNormalizeURIPath(copy);
96*7c568831SAndroid Build Coastguard Worker xmlFree(copy);
97*7c568831SAndroid Build Coastguard Worker
98*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetLimit(0);
99*7c568831SAndroid Build Coastguard Worker xmlFuzzDataCleanup();
100*7c568831SAndroid Build Coastguard Worker
101*7c568831SAndroid Build Coastguard Worker return 0;
102*7c568831SAndroid Build Coastguard Worker }
103*7c568831SAndroid Build Coastguard Worker
104