blob: cc1d96d1b5afec45765e92f2a9fd9b6bf428bed0 [file] [log] [blame]
// Copyright (c) 2016-2017 The OTS 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 <stddef.h>
#include <stdint.h>
#ifndef OTS_FUZZER_NO_MAIN
#include <fstream>
#include <iostream>
#include <iterator>
#endif
#include "opentype-sanitiser.h"
#include "ots-memory-stream.h"
#include "ots.h"
// Entry point for LibFuzzer.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
ots::OTSContext context;
ots::ExpandingMemoryStream stream(size /*initial*/, size * 8 /*limit*/);
bool ok = context.Process(&stream, data, size);
if (ok) {
ots::Buffer file(data, size);
uint32_t tag;
if (file.ReadU32(&tag) && tag == OTS_TAG('t','t','c','f')) {
uint32_t num_fonts;
if (file.Skip(sizeof(uint32_t)) && file.ReadU32(&num_fonts)) {
for (uint32_t i = 0; i < num_fonts; i++) {
stream.Seek(0);
context.Process(&stream, data, size, i);
}
}
}
}
return 0;
}
#ifndef OTS_FUZZER_NO_MAIN
int main(int argc, char **argv) {
for (int i = 1; i < argc; i++) {
std::cout << argv[i] << std::endl;
std::ifstream f(argv[i], std::ifstream::binary);
if (!f.good())
return 1;
std::string s((std::istreambuf_iterator<char>(f)),
(std::istreambuf_iterator<char>()));
LLVMFuzzerTestOneInput((const uint8_t*)s.data(), s.size());
}
return 0;
}
#endif