blob: 45201c819be915cfd2fe932a40b6a7a21d6d5f5b [file] [log] [blame]
// Copyright 2019 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.
#include <string>
#include <vector>
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "pdf/pdfium/fuzzers/pdfium_xfa_lpm_fuzzer/simple_xfa_pdf.h"
namespace pdfium_xfa_lpm_fuzzer {
namespace {
const char kSimplePdfTemplate[] = R"(%PDF-1.7
%
1 0 obj <<
/XFA 5 0 R
>>
endobj
2 0 obj <<
/Type /Pages
/Count 1
/Kids [3 0 R]
>>
endobj
3 0 obj <<
/Type /Page
/MediaBox [0 0 600 800]
/Parent 2 0 R
>>
endobj
4 0 obj <<
/Extensions <<
/ADBE <<
/BaseVersion /1.0
/ExtensionLevel 8
>>
>>
/Pages 2 0 R
/Type /Catalog
/AcroForm 1 0 R
/NeedsRendering true
>>
endobj
5 0 obj <<
/Length $1
>>
stream
$2
endstream
endobj
xref
6 0
0000000000 65535 f
0000000015 00000 n
0000000047 00000 n
0000000104 00000 n
0000000175 00000 n
0000000327 00000 n
trailer <<
/Size 6
/Root 4 0 R
>>
startxref
$3
%%EOF)";
} // namespace
std::string CreateSimpleXfaPdf(const std::string& xfa_string) {
// Add 1 for newline before endstream.
std::string xfa_stream_len = base::NumberToString(xfa_string.size() + 1);
// Each placeholder is two bytes. Two of them precede xref.
const size_t kPlaceholderSizes = 2 * 2;
static const size_t kCurrentXrefPosition =
std::string(kSimplePdfTemplate).find("xref");
std::string startxref =
base::NumberToString(kCurrentXrefPosition - kPlaceholderSizes +
xfa_string.size() + xfa_stream_len.size() + 1);
std::vector<std::string> replacements(
{xfa_stream_len, xfa_string, startxref});
return base::ReplaceStringPlaceholders(kSimplePdfTemplate, replacements,
nullptr);
}
} // namespace pdfium_xfa_lpm_fuzzer