Coverage Report

Created: 2026-03-08 06:23

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