blob: 18434f7b173e086e46e3fd2cf4773115f4a43fe8 [file] [log] [blame]
// Copyright 2017 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 <memory.h>
#include <stddef.h>
#include <stdint.h>
#include <vector>
#include "third_party/minizip/src/mz.h"
#include "third_party/minizip/src/mz_strm_mem.h"
#include "third_party/minizip/src/mz_zip.h"
namespace {
const char kTestPassword[] = "test123";
const char kTestFileName[] = "foo";
const char kTestFileNameUppercase[] = "FOO";
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
void* stream = mz_stream_mem_create(nullptr);
mz_stream_mem_set_buffer(
stream, reinterpret_cast<void*>(const_cast<uint8_t*>(data)), size);
constexpr int kReadBufferSize = 1024;
std::vector<char> read_buffer(kReadBufferSize);
void* zip_file = mz_zip_create(nullptr);
int result = mz_zip_open(zip_file, stream, MZ_OPEN_MODE_READ);
if (result == MZ_OK) {
// Some archive properties that are non-fatal for reading the archive.
const char* archive_comment = nullptr;
mz_zip_get_comment(zip_file, &archive_comment);
uint16_t version_madeby = 0;
mz_zip_get_version_madeby(zip_file, &version_madeby);
uint64_t num_entries = 0;
mz_zip_get_number_entry(zip_file, &num_entries);
result = mz_zip_goto_first_entry(zip_file);
while (result == MZ_OK) {
mz_zip_file* file_info = nullptr;
result = mz_zip_entry_get_info(zip_file, &file_info);
if (result != MZ_OK) {
break;
}
bool is_encrypted = (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED);
result = mz_zip_entry_read_open(zip_file, 0,
is_encrypted ? kTestPassword : nullptr);
if (result != MZ_OK) {
break;
}
result = mz_zip_entry_is_open(zip_file);
if (result != MZ_OK) {
break;
}
// Return value isn't checked here because we can't predict what the value
// will be.
mz_zip_entry_is_dir(zip_file);
result = mz_zip_get_entry(zip_file);
if (result < 0) {
break;
}
result = mz_zip_entry_read(zip_file, read_buffer.data(), kReadBufferSize);
if (result < 0) {
break;
}
result = mz_zip_entry_close(zip_file);
if (result != MZ_OK) {
break;
}
result = mz_zip_goto_next_entry(zip_file);
}
mz_zip_entry_close(zip_file);
// Return value isn't checked here because we can't predict what the value
// will be.
mz_zip_locate_entry(zip_file, kTestFileName, 0);
mz_zip_locate_entry(zip_file, kTestFileNameUppercase, 0);
mz_zip_locate_entry(zip_file, kTestFileName, 1);
mz_zip_locate_entry(zip_file, kTestFileNameUppercase, 1);
mz_zip_close(zip_file);
}
mz_zip_delete(&zip_file);
mz_stream_mem_delete(&stream);
return 0;
}