Skip to content

Commit 6283228

Browse files
frankistcodebot
authored andcommitted
asn1: use bound-checking for dyn_array
1 parent 5cfd44c commit 6283228

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

include/srsran/asn1/asn1_utils.h

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -196,23 +196,26 @@ class dyn_array
196196
}
197197
}
198198
dyn_array(const dyn_array<T>& other) : dyn_array(other.data(), other.size()) {}
199-
dyn_array(const T* ptr, uint32_t nof_items)
199+
dyn_array(const T* ptr, uint32_t nof_items) : size_(nof_items), cap_(nof_items)
200200
{
201-
size_ = nof_items;
202-
cap_ = nof_items;
203-
data_ = new T[cap_];
204-
std::copy(ptr, ptr + size_, data_);
201+
if (size_ > 0) {
202+
data_ = new T[cap_];
203+
std::copy(ptr, ptr + size_, data_);
204+
}
205205
}
206-
~dyn_array()
206+
~dyn_array() { delete[] data_; }
207+
uint32_t size() const { return size_; }
208+
uint32_t capacity() const { return cap_; }
209+
T& operator[](uint32_t idx)
207210
{
208-
if (data_ != nullptr) {
209-
delete[] data_;
210-
}
211+
srsran_assert(idx < size(), "out-of-bounds access to dyn_array ({} >= {})", idx, size());
212+
return data_[idx];
213+
}
214+
const T& operator[](uint32_t idx) const
215+
{
216+
srsran_assert(idx < size(), "out-of-bounds access to dyn_array ({} >= {})", idx, size());
217+
return data_[idx];
211218
}
212-
uint32_t size() const { return size_; }
213-
uint32_t capacity() const { return cap_; }
214-
T& operator[](uint32_t idx) { return data_[idx]; }
215-
const T& operator[](uint32_t idx) const { return data_[idx]; }
216219
dyn_array<T>& operator=(const dyn_array<T>& other)
217220
{
218221
if (this == &other) {
@@ -275,14 +278,14 @@ class dyn_array
275278
data_[size() - 1] = elem;
276279
}
277280
void clear() { resize(0); }
278-
T& back() { return data_[size() - 1]; }
279-
const T& back() const { return data_[size() - 1]; }
280-
T* data() { return &data_[0]; }
281-
const T* data() const { return &data_[0]; }
282-
iterator begin() { return &data_[0]; }
283-
iterator end() { return &data_[size()]; }
284-
const_iterator begin() const { return &data_[0]; }
285-
const_iterator end() const { return &data_[size()]; }
281+
T& back() { return (*this)[size() - 1]; }
282+
const T& back() const { return (*this)[size() - 1]; }
283+
T* data() { return data_; }
284+
const T* data() const { return data_; }
285+
iterator begin() { return data_; }
286+
iterator end() { return data_ + size(); }
287+
const_iterator begin() const { return data_; }
288+
const_iterator end() const { return data_ + size(); }
286289

287290
private:
288291
T* data_ = nullptr;

0 commit comments

Comments
 (0)