1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" 6 7 #include <stdlib.h> 8 9 #include <algorithm> 10 11 #include "mojo/public/cpp/bindings/lib/bindings_serialization.h" 12 #include "mojo/public/cpp/environment/logging.h" 13 14 namespace mojo { 15 namespace internal { 16 FixedBuffer(size_t size)17FixedBuffer::FixedBuffer(size_t size) 18 : ptr_(NULL), 19 cursor_(0), 20 size_(internal::Align(size)) { 21 // calloc() required to zero memory and thus avoid info leaks. 22 ptr_ = static_cast<char*>(calloc(size_, 1)); 23 } 24 ~FixedBuffer()25FixedBuffer::~FixedBuffer() { 26 free(ptr_); 27 } 28 Allocate(size_t delta)29void* FixedBuffer::Allocate(size_t delta) { 30 delta = internal::Align(delta); 31 32 if (delta == 0 || delta > size_ - cursor_) { 33 MOJO_DCHECK(false) << "Not reached"; 34 return NULL; 35 } 36 37 char* result = ptr_ + cursor_; 38 cursor_ += delta; 39 40 return result; 41 } 42 Leak()43void* FixedBuffer::Leak() { 44 char* ptr = ptr_; 45 ptr_ = NULL; 46 cursor_ = 0; 47 size_ = 0; 48 return ptr; 49 } 50 51 } // namespace internal 52 } // namespace mojo 53