blob: f014d7471dad1828d8874c9376d31b4477538a0f [file] [log] [blame] [edit]
// Copyright 2020 The Fuchsia 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 "test-input.h"
#include <lib/zx/vmar.h>
#include <string.h>
#include <zircon/errors.h>
#include <zircon/rights.h>
#include <zircon/status.h>
#include <algorithm>
namespace fuzzing {
const size_t TestInput::kVmoSize;
const size_t TestInput::kMaxInputSize = kVmoSize - sizeof(uint64_t);
TestInput::TestInput() {}
TestInput::~TestInput() {}
zx_status_t TestInput::Create(size_t len) {
if (len != kVmoSize) {
return ZX_ERR_NOT_SUPPORTED;
}
return SharedMemory::Create(kVmoSize);
}
zx_status_t TestInput::Link(const zx::vmo &vmo, size_t len) {
if (len != kVmoSize) {
return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t status = SharedMemory::Link(vmo, kVmoSize);
if (status != ZX_OK) {
return status;
}
data_ = reinterpret_cast<uint8_t *>(addr() + sizeof(uint64_t));
size_ = reinterpret_cast<uint64_t *>(addr());
return ZX_OK;
}
zx_status_t TestInput::Write(const void *data, size_t size) const {
if (!size_) {
return ZX_ERR_BAD_STATE;
}
uint64_t offset = *size_;
size_t len = std::min(size, kMaxInputSize - offset);
memcpy(&data_[offset], data, len);
*size_ = offset + len;
return len == size ? ZX_OK : ZX_ERR_BUFFER_TOO_SMALL;
}
zx_status_t TestInput::Clear() const {
if (!size_) {
return ZX_ERR_BAD_STATE;
}
*size_ = 0;
return ZX_OK;
}
} // namespace fuzzing