blob: 1772863c5f24995df4bdce79a2cc75f4d5d621a6 [file] [log] [blame]
Kevin Cernekeed05be172017-06-17 17:40:21 -07001// Copyright (c) 2011 The Chromium OS 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
Garrick Evans3388a032020-03-24 11:25:55 +09005#include "patchpanel/dns/io_buffer.h"
Kevin Cernekeed05be172017-06-17 17:40:21 -07006
7#include "base/logging.h"
8#include "base/numerics/safe_math.h"
9
Qijiang Fan713061e2021-03-08 15:45:12 +090010#include <base/check_op.h>
11
Jason Jeremy Imana21be272020-10-21 17:53:45 +090012namespace patchpanel {
Kevin Cernekeed05be172017-06-17 17:40:21 -070013
14namespace {
15
16// TODO(eroman): IOBuffer is being converted to require buffer sizes and offsets
17// be specified as "size_t" rather than "int" (crbug.com/488553). To facilitate
18// this move (since LOTS of code needs to be updated), both "size_t" and "int
19// are being accepted. When using "size_t" this function ensures that it can be
20// safely converted to an "int" without truncation.
21void AssertValidBufferSize(size_t size) {
22 base::CheckedNumeric<int>(size).ValueOrDie();
23}
24
25void AssertValidBufferSize(int size) {
26 CHECK_GE(size, 0);
27}
28
29} // namespace
30
Ben Chanac009042019-09-20 16:19:56 -070031IOBuffer::IOBuffer() : data_(nullptr) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -070032
33IOBuffer::IOBuffer(int buffer_size) {
34 AssertValidBufferSize(buffer_size);
35 data_ = new char[buffer_size];
36}
37
38IOBuffer::IOBuffer(size_t buffer_size) {
39 AssertValidBufferSize(buffer_size);
40 data_ = new char[buffer_size];
41}
42
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090043IOBuffer::IOBuffer(char* data) : data_(data) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -070044
45IOBuffer::~IOBuffer() {
46 delete[] data_;
Ben Chanac009042019-09-20 16:19:56 -070047 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -070048}
49
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090050IOBufferWithSize::IOBufferWithSize(int size) : IOBuffer(size), size_(size) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070051 AssertValidBufferSize(size);
52}
53
54IOBufferWithSize::IOBufferWithSize(size_t size) : IOBuffer(size), size_(size) {
55 // Note: Size check is done in superclass' constructor.
56}
57
58IOBufferWithSize::IOBufferWithSize(char* data, int size)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090059 : IOBuffer(data), size_(size) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070060 AssertValidBufferSize(size);
61}
62
63IOBufferWithSize::IOBufferWithSize(char* data, size_t size)
64 : IOBuffer(data), size_(size) {
65 AssertValidBufferSize(size);
66}
67
Ben Chan4f386502019-09-20 16:17:59 -070068IOBufferWithSize::~IOBufferWithSize() = default;
Kevin Cernekeed05be172017-06-17 17:40:21 -070069
70StringIOBuffer::StringIOBuffer(const std::string& s)
Ben Chanac009042019-09-20 16:19:56 -070071 : IOBuffer(nullptr), string_data_(s) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070072 AssertValidBufferSize(s.size());
73 data_ = const_cast<char*>(string_data_.data());
74}
75
76StringIOBuffer::StringIOBuffer(std::unique_ptr<std::string> s)
Ben Chanac009042019-09-20 16:19:56 -070077 : IOBuffer(nullptr) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070078 AssertValidBufferSize(s->size());
79 string_data_.swap(*s.get());
80 data_ = const_cast<char*>(string_data_.data());
81}
82
83StringIOBuffer::~StringIOBuffer() {
84 // We haven't allocated the buffer, so remove it before the base class
85 // destructor tries to delete[] it.
Ben Chanac009042019-09-20 16:19:56 -070086 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -070087}
88
89DrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, int size)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090090 : IOBuffer(base->data()), base_(base), size_(size), used_(0) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070091 AssertValidBufferSize(size);
92}
93
94DrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, size_t size)
95 : IOBuffer(base->data()), base_(base), size_(size), used_(0) {
96 AssertValidBufferSize(size);
97}
98
99void DrainableIOBuffer::DidConsume(int bytes) {
100 SetOffset(used_ + bytes);
101}
102
103int DrainableIOBuffer::BytesRemaining() const {
104 return size_ - used_;
105}
106
107// Returns the number of consumed bytes.
108int DrainableIOBuffer::BytesConsumed() const {
109 return used_;
110}
111
112void DrainableIOBuffer::SetOffset(int bytes) {
113 DCHECK_GE(bytes, 0);
114 DCHECK_LE(bytes, size_);
115 used_ = bytes;
116 data_ = base_->data() + used_;
117}
118
119DrainableIOBuffer::~DrainableIOBuffer() {
120 // The buffer is owned by the |base_| instance.
Ben Chanac009042019-09-20 16:19:56 -0700121 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700122}
123
Hidehiko Abe3a7e5132018-02-15 13:07:50 +0900124GrowableIOBuffer::GrowableIOBuffer() : IOBuffer(), capacity_(0), offset_(0) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -0700125
126void GrowableIOBuffer::SetCapacity(int capacity) {
127 DCHECK_GE(capacity, 0);
128 // realloc will crash if it fails.
129 real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
130 capacity_ = capacity;
131 if (offset_ > capacity)
132 set_offset(capacity);
133 else
134 set_offset(offset_); // The pointer may have changed.
135}
136
137void GrowableIOBuffer::set_offset(int offset) {
138 DCHECK_GE(offset, 0);
139 DCHECK_LE(offset, capacity_);
140 offset_ = offset;
141 data_ = real_data_.get() + offset;
142}
143
144int GrowableIOBuffer::RemainingCapacity() {
145 return capacity_ - offset_;
146}
147
148char* GrowableIOBuffer::StartOfBuffer() {
149 return real_data_.get();
150}
151
152GrowableIOBuffer::~GrowableIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700153 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700154}
155
Ben Chan4f386502019-09-20 16:17:59 -0700156PickledIOBuffer::PickledIOBuffer() = default;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700157
158void PickledIOBuffer::Done() {
159 data_ = const_cast<char*>(static_cast<const char*>(pickle_.data()));
160}
161
162PickledIOBuffer::~PickledIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700163 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700164}
165
166WrappedIOBuffer::WrappedIOBuffer(const char* data)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +0900167 : IOBuffer(const_cast<char*>(data)) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -0700168
169WrappedIOBuffer::~WrappedIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700170 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700171}
172
Jason Jeremy Imana21be272020-10-21 17:53:45 +0900173} // namespace patchpanel