blob: 1f258f272106e21429257d2cb91f0b3cdcba2edd [file] [log] [blame]
Huizi Yangb3c85b62021-03-15 15:47:48 -07001// SPDX-License-Identifier: Apache-2.0
2
3#include <stddef.h>
4#include <stdint.h>
5
Huizi Yangb3c85b62021-03-15 15:47:48 -07006#include "fuzzer/FuzzedDataProvider.h"
hamzeh957e9802021-10-22 14:56:58 -07007#include <android-base/file.h>
8#include <ziparchive/zip_writer.h>
Huizi Yangb3c85b62021-03-15 15:47:48 -07009
10// See current fuzz coverage here:
11// https://android-coverage.googleplex.com/fuzz_targets/libziparchive_writer_fuzzer/index.html
12
13extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
14 FuzzedDataProvider provider(data, size);
hamzeh957e9802021-10-22 14:56:58 -070015 std::unique_ptr<std::FILE, decltype(&fclose)> fp(tmpfile(), &fclose);
Huizi Yangb3c85b62021-03-15 15:47:48 -070016 if (!fp) {
17 return 0;
18 }
19 ZipWriter writer(fp.get());
20 for (int i = 0; i < 2; i++) {
21 if (provider.remaining_bytes() == 0) {
22 break;
23 }
24 auto path = provider.ConsumeRandomLengthString();
25 if (writer.StartEntry(path, path.size()) == 0) {
26 for (int j = 0; j < 2; j++) {
27 if (provider.remaining_bytes() == 0) {
28 break;
29 }
30 const size_t next_size = provider.ConsumeIntegralInRange<size_t>(
31 0, provider.remaining_bytes());
32 auto next_buf = provider.ConsumeBytes<uint8_t>(next_size);
33 writer.WriteBytes(next_buf.data(), next_buf.size());
34 }
35 writer.FinishEntry();
36 }
37 }
38 writer.Finish();
39 return 0;
40}