|  | // Copyright 2017 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 "src/lib/fsl/vmo/sized_vmo.h" | 
|  |  | 
|  | #include <lib/syslog/cpp/macros.h> | 
|  |  | 
|  | namespace fsl { | 
|  |  | 
|  | SizedVmo::SizedVmo(std::nullptr_t) : vmo_(), size_(0u) {} | 
|  |  | 
|  | SizedVmo::SizedVmo(zx::vmo vmo, uint64_t size) : vmo_(std::move(vmo)), size_(size) { | 
|  | FX_DCHECK(vmo_ && IsSizeValid(vmo_, size_)); | 
|  | } | 
|  |  | 
|  | bool SizedVmo::FromTransport(fuchsia::mem::Buffer transport, SizedVmo* out) { | 
|  | FX_DCHECK(transport.vmo); | 
|  |  | 
|  | if (!IsSizeValid(transport.vmo, transport.size)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | *out = SizedVmo(std::move(transport.vmo), transport.size); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool SizedVmo::IsSizeValid(const zx::vmo& vmo, uint64_t size) { | 
|  | size_t vmo_size; | 
|  | zx_status_t zx_status = vmo.get_size(&vmo_size); | 
|  | if (zx_status != ZX_OK) { | 
|  | FX_PLOGS(ERROR, zx_status) << "Unable to get VMO size"; | 
|  | return false; | 
|  | } | 
|  | return vmo_size >= size; | 
|  | } | 
|  |  | 
|  | SizedVmo::SizedVmo(SizedVmo&& other) : vmo_(std::move(other.vmo_)), size_(other.size_) { | 
|  | other.size_ = 0; | 
|  | } | 
|  |  | 
|  | SizedVmo::~SizedVmo() = default; | 
|  |  | 
|  | SizedVmo& SizedVmo::operator=(SizedVmo&& other) { | 
|  | vmo_ = std::move(other.vmo_); | 
|  | size_ = other.size_; | 
|  | other.size_ = 0; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | fuchsia::mem::Buffer SizedVmo::ToTransport() && { | 
|  | fuchsia::mem::Buffer result; | 
|  | if (!vmo_) { | 
|  | return result; | 
|  | } | 
|  | result.vmo = std::move(vmo_); | 
|  | result.size = size_; | 
|  | size_ = 0; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | zx_status_t SizedVmo::Duplicate(zx_rights_t rights, SizedVmo* output) const { | 
|  | zx_status_t status = vmo_.duplicate(rights, &output->vmo_); | 
|  | if (status == ZX_OK) { | 
|  | output->size_ = size_; | 
|  | } | 
|  | return status; | 
|  | } | 
|  |  | 
|  | zx_status_t SizedVmo::ReplaceAsExecutable(const zx::resource& vmex) { | 
|  | return vmo_.replace_as_executable(vmex, &vmo_); | 
|  | } | 
|  |  | 
|  | }  // namespace fsl |