/src/poco/XML/fuzzing/XMLParse.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include "Poco/AutoPtr.h" |
2 | | #include "Poco/DOM/DOMParser.h" |
3 | | #include "Poco/DOM/Document.h" |
4 | | #include "Poco/SAX/DefaultHandler.h" |
5 | | #include "Poco/SAX/SAXParser.h" |
6 | | #include "Poco/XML/XMLStreamParser.h" |
7 | | |
8 | | using namespace Poco; |
9 | | using namespace Poco::XML; |
10 | | |
11 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
12 | 25.4k | { |
13 | 25.4k | std::string xml(reinterpret_cast<const char*>(data), size); |
14 | | |
15 | | // SAX Parser |
16 | | |
17 | 25.4k | SAXParser saxParser; |
18 | 25.4k | std::uint8_t saxFeatures = size > 0 ? data[size - 1] : 0; |
19 | | |
20 | 25.4k | DefaultHandler defHandler; |
21 | 25.4k | saxParser.setContentHandler(&defHandler); |
22 | 25.4k | saxParser.setDTDHandler(&defHandler); |
23 | 25.4k | saxParser.setErrorHandler(&defHandler); |
24 | 25.4k | saxParser.setEntityResolver(&defHandler); |
25 | | |
26 | 25.4k | for (const auto feature : { |
27 | 25.4k | XMLReader::FEATURE_EXTERNAL_GENERAL_ENTITIES, |
28 | 25.4k | XMLReader::FEATURE_EXTERNAL_PARAMETER_ENTITIES, |
29 | 25.4k | XMLReader::FEATURE_NAMESPACES, |
30 | 25.4k | XMLReader::FEATURE_NAMESPACE_PREFIXES, |
31 | 25.4k | SAXParser::FEATURE_PARTIAL_READS, |
32 | 25.4k | }) |
33 | 127k | { |
34 | 127k | saxParser.setFeature(feature, saxFeatures & 0x01); |
35 | 127k | saxFeatures >>= 1; |
36 | 127k | } |
37 | | |
38 | 25.4k | try |
39 | 25.4k | { |
40 | 25.4k | saxParser.parseString(xml); |
41 | 25.4k | } |
42 | 25.4k | catch (const std::exception&) |
43 | 25.4k | { |
44 | 25.3k | } |
45 | | |
46 | | // DOM Parser |
47 | | |
48 | 25.4k | DOMParser domParser; |
49 | 25.4k | std::uint8_t domFeatures = size > 0 ? data[size - 1] : 0; |
50 | | |
51 | 25.4k | for (const auto feature : { |
52 | 25.4k | XMLReader::FEATURE_EXTERNAL_GENERAL_ENTITIES, |
53 | 25.4k | XMLReader::FEATURE_EXTERNAL_PARAMETER_ENTITIES, |
54 | 25.4k | XMLReader::FEATURE_NAMESPACES, |
55 | 25.4k | XMLReader::FEATURE_NAMESPACE_PREFIXES, |
56 | 25.4k | DOMParser::FEATURE_FILTER_WHITESPACE, |
57 | 25.4k | }) |
58 | 127k | { |
59 | 127k | domParser.setFeature(feature, domFeatures & 0x01); |
60 | 127k | domFeatures >>= 1; |
61 | 127k | } |
62 | | |
63 | 25.4k | try |
64 | 25.4k | { |
65 | 25.4k | Poco::AutoPtr<Document> doc = domParser.parseString(xml); |
66 | 25.4k | } |
67 | 25.4k | catch (const std::exception&) |
68 | 25.4k | { |
69 | 25.3k | } |
70 | | |
71 | | // Stream Parser |
72 | | |
73 | 25.4k | std::istringstream stream(xml); |
74 | | |
75 | 25.4k | try |
76 | 25.4k | { |
77 | 25.4k | XMLStreamParser streamParser(stream, "fuzz"); |
78 | 25.4k | for (XMLStreamParser::EventType e : streamParser) |
79 | 29.9M | { |
80 | 29.9M | streamParser.getQName().toString(); |
81 | 29.9M | } |
82 | 25.4k | } |
83 | 25.4k | catch (const std::exception&) |
84 | 25.4k | { |
85 | 25.4k | } |
86 | | |
87 | 25.4k | return 0; |
88 | 25.4k | } |