blob: a15ca7275e06aabcd5af98591f5483ed47b5da0a [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
10namespace net {
11
12namespace {
13
14// TODO(eroman): IOBuffer is being converted to require buffer sizes and offsets
15// be specified as "size_t" rather than "int" (crbug.com/488553). To facilitate
16// this move (since LOTS of code needs to be updated), both "size_t" and "int
17// are being accepted. When using "size_t" this function ensures that it can be
18// safely converted to an "int" without truncation.
19void AssertValidBufferSize(size_t size) {
20 base::CheckedNumeric<int>(size).ValueOrDie();
21}
22
23void AssertValidBufferSize(int size) {
24 CHECK_GE(size, 0);
25}
26
27} // namespace
28
Ben Chanac009042019-09-20 16:19:56 -070029IOBuffer::IOBuffer() : data_(nullptr) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -070030
31IOBuffer::IOBuffer(int buffer_size) {
32 AssertValidBufferSize(buffer_size);
33 data_ = new char[buffer_size];
34}
35
36IOBuffer::IOBuffer(size_t buffer_size) {
37 AssertValidBufferSize(buffer_size);
38 data_ = new char[buffer_size];
39}
40
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090041IOBuffer::IOBuffer(char* data) : data_(data) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -070042
43IOBuffer::~IOBuffer() {
44 delete[] data_;
Ben Chanac009042019-09-20 16:19:56 -070045 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -070046}
47
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090048IOBufferWithSize::IOBufferWithSize(int size) : IOBuffer(size), size_(size) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070049 AssertValidBufferSize(size);
50}
51
52IOBufferWithSize::IOBufferWithSize(size_t size) : IOBuffer(size), size_(size) {
53 // Note: Size check is done in superclass' constructor.
54}
55
56IOBufferWithSize::IOBufferWithSize(char* data, int size)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090057 : IOBuffer(data), size_(size) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070058 AssertValidBufferSize(size);
59}
60
61IOBufferWithSize::IOBufferWithSize(char* data, size_t size)
62 : IOBuffer(data), size_(size) {
63 AssertValidBufferSize(size);
64}
65
Ben Chan4f386502019-09-20 16:17:59 -070066IOBufferWithSize::~IOBufferWithSize() = default;
Kevin Cernekeed05be172017-06-17 17:40:21 -070067
68StringIOBuffer::StringIOBuffer(const std::string& s)
Ben Chanac009042019-09-20 16:19:56 -070069 : IOBuffer(nullptr), string_data_(s) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070070 AssertValidBufferSize(s.size());
71 data_ = const_cast<char*>(string_data_.data());
72}
73
74StringIOBuffer::StringIOBuffer(std::unique_ptr<std::string> s)
Ben Chanac009042019-09-20 16:19:56 -070075 : IOBuffer(nullptr) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070076 AssertValidBufferSize(s->size());
77 string_data_.swap(*s.get());
78 data_ = const_cast<char*>(string_data_.data());
79}
80
81StringIOBuffer::~StringIOBuffer() {
82 // We haven't allocated the buffer, so remove it before the base class
83 // destructor tries to delete[] it.
Ben Chanac009042019-09-20 16:19:56 -070084 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -070085}
86
87DrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, int size)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +090088 : IOBuffer(base->data()), base_(base), size_(size), used_(0) {
Kevin Cernekeed05be172017-06-17 17:40:21 -070089 AssertValidBufferSize(size);
90}
91
92DrainableIOBuffer::DrainableIOBuffer(IOBuffer* base, size_t size)
93 : IOBuffer(base->data()), base_(base), size_(size), used_(0) {
94 AssertValidBufferSize(size);
95}
96
97void DrainableIOBuffer::DidConsume(int bytes) {
98 SetOffset(used_ + bytes);
99}
100
101int DrainableIOBuffer::BytesRemaining() const {
102 return size_ - used_;
103}
104
105// Returns the number of consumed bytes.
106int DrainableIOBuffer::BytesConsumed() const {
107 return used_;
108}
109
110void DrainableIOBuffer::SetOffset(int bytes) {
111 DCHECK_GE(bytes, 0);
112 DCHECK_LE(bytes, size_);
113 used_ = bytes;
114 data_ = base_->data() + used_;
115}
116
117DrainableIOBuffer::~DrainableIOBuffer() {
118 // The buffer is owned by the |base_| instance.
Ben Chanac009042019-09-20 16:19:56 -0700119 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700120}
121
Hidehiko Abe3a7e5132018-02-15 13:07:50 +0900122GrowableIOBuffer::GrowableIOBuffer() : IOBuffer(), capacity_(0), offset_(0) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -0700123
124void GrowableIOBuffer::SetCapacity(int capacity) {
125 DCHECK_GE(capacity, 0);
126 // realloc will crash if it fails.
127 real_data_.reset(static_cast<char*>(realloc(real_data_.release(), capacity)));
128 capacity_ = capacity;
129 if (offset_ > capacity)
130 set_offset(capacity);
131 else
132 set_offset(offset_); // The pointer may have changed.
133}
134
135void GrowableIOBuffer::set_offset(int offset) {
136 DCHECK_GE(offset, 0);
137 DCHECK_LE(offset, capacity_);
138 offset_ = offset;
139 data_ = real_data_.get() + offset;
140}
141
142int GrowableIOBuffer::RemainingCapacity() {
143 return capacity_ - offset_;
144}
145
146char* GrowableIOBuffer::StartOfBuffer() {
147 return real_data_.get();
148}
149
150GrowableIOBuffer::~GrowableIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700151 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700152}
153
Ben Chan4f386502019-09-20 16:17:59 -0700154PickledIOBuffer::PickledIOBuffer() = default;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700155
156void PickledIOBuffer::Done() {
157 data_ = const_cast<char*>(static_cast<const char*>(pickle_.data()));
158}
159
160PickledIOBuffer::~PickledIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700161 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700162}
163
164WrappedIOBuffer::WrappedIOBuffer(const char* data)
Hidehiko Abe3a7e5132018-02-15 13:07:50 +0900165 : IOBuffer(const_cast<char*>(data)) {}
Kevin Cernekeed05be172017-06-17 17:40:21 -0700166
167WrappedIOBuffer::~WrappedIOBuffer() {
Ben Chanac009042019-09-20 16:19:56 -0700168 data_ = nullptr;
Kevin Cernekeed05be172017-06-17 17:40:21 -0700169}
170
171} // namespace net