2016-08-30 22:30:53 +00:00
|
|
|
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2017-02-15 05:49:06 +00:00
|
|
|
#include <cassert>
|
2017-02-15 15:31:15 +00:00
|
|
|
#include <cstddef>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <limits>
|
|
|
|
#include <string>
|
2016-08-30 22:30:53 +00:00
|
|
|
|
|
|
|
#include "libxml/parser.h"
|
2017-02-15 05:49:06 +00:00
|
|
|
#include "libxml/xmlsave.h"
|
2016-08-30 22:30:53 +00:00
|
|
|
|
|
|
|
void ignore (void* ctx, const char* msg, ...) {
|
|
|
|
// Error handler to avoid spam of error messages from libxml parser.
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
|
|
|
xmlSetGenericErrorFunc(NULL, &ignore);
|
|
|
|
|
2017-02-15 15:31:15 +00:00
|
|
|
// Test default empty options value and some random combination.
|
|
|
|
std::string data_string(reinterpret_cast<const char*>(data), size);
|
|
|
|
const std::size_t data_hash = std::hash<std::string>()(data_string);
|
|
|
|
const int max_option_value = std::numeric_limits<int>::max();
|
2017-10-21 03:28:12 +00:00
|
|
|
int random_option_value = data_hash % max_option_value;
|
2017-10-17 15:19:38 +00:00
|
|
|
|
|
|
|
// Disable XML_PARSE_HUGE to avoid stack overflow.
|
|
|
|
random_option_value &= ~XML_PARSE_HUGE;
|
2017-02-15 15:31:15 +00:00
|
|
|
const int options[] = {0, random_option_value};
|
|
|
|
|
|
|
|
for (const auto option_value : options) {
|
|
|
|
if (auto doc = xmlReadMemory(data_string.c_str(), data_string.length(),
|
|
|
|
"noname.xml", NULL, option_value)) {
|
|
|
|
auto buf = xmlBufferCreate();
|
|
|
|
assert(buf);
|
|
|
|
auto ctxt = xmlSaveToBuffer(buf, NULL, 0);
|
|
|
|
xmlSaveDoc(ctxt, doc);
|
|
|
|
xmlSaveClose(ctxt);
|
|
|
|
xmlFreeDoc(doc);
|
|
|
|
xmlBufferFree(buf);
|
|
|
|
}
|
2016-08-30 22:30:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|