Coverage Report

Created: 2025-07-12 06:36

/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
}