зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1483699
- part 1 - add overflow checks for extending arrays; r=mccr8
This commit is contained in:
Родитель
764da0c5ac
Коммит
1e6d9316da
|
@ -108,6 +108,23 @@ nsTArray_base<Alloc, Copy>::UsesAutoArrayBuffer() const
|
|||
bool IsTwiceTheRequiredBytesRepresentableAsUint32(size_t aCapacity,
|
||||
size_t aElemSize);
|
||||
|
||||
template<class Alloc, class Copy>
|
||||
template<typename ActualAlloc>
|
||||
typename ActualAlloc::ResultTypeProxy
|
||||
nsTArray_base<Alloc, Copy>::ExtendCapacity(size_type aLength,
|
||||
size_type aCount,
|
||||
size_type aElemSize)
|
||||
{
|
||||
mozilla::CheckedInt<size_type> newLength = aLength;
|
||||
newLength += aCount;
|
||||
|
||||
if (!newLength.isValid()) {
|
||||
return ActualAlloc::FailureResult();
|
||||
}
|
||||
|
||||
return this->EnsureCapacity<ActualAlloc>(newLength.value(), aElemSize);
|
||||
}
|
||||
|
||||
template<class Alloc, class Copy>
|
||||
template<typename ActualAlloc>
|
||||
typename ActualAlloc::ResultTypeProxy
|
||||
|
|
|
@ -396,6 +396,17 @@ protected:
|
|||
typename ActualAlloc::ResultTypeProxy EnsureCapacity(size_type aCapacity,
|
||||
size_type aElemSize);
|
||||
|
||||
// Extend the storage to accommodate aCount extra elements.
|
||||
// @param aLength The current size of the array.
|
||||
// @param aCount The number of elements to add.
|
||||
// @param aElemSize The size of an array element.
|
||||
// @return False if insufficient memory is available or the new length
|
||||
// would overflow; true otherwise.
|
||||
template<typename ActualAlloc>
|
||||
typename ActualAlloc::ResultTypeProxy ExtendCapacity(size_type aLength,
|
||||
size_type aCount,
|
||||
size_type aElemSize);
|
||||
|
||||
// Tries to resize the storage to the minimum required amount. If this fails,
|
||||
// the array is left as-is.
|
||||
// @param aElemSize The size of an array element.
|
||||
|
@ -1761,8 +1772,8 @@ public:
|
|||
protected:
|
||||
template<typename ActualAlloc = Alloc>
|
||||
elem_type* AppendElements(size_type aCount) {
|
||||
if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
|
||||
Length() + aCount, sizeof(elem_type)))) {
|
||||
if (!ActualAlloc::Successful(this->template ExtendCapacity<ActualAlloc>(
|
||||
Length(), aCount, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
}
|
||||
elem_type* elems = Elements() + Length();
|
||||
|
@ -2480,6 +2491,7 @@ nsTArray_Impl<E, Alloc>::InsertElementAt(index_type aIndex) -> elem_type*
|
|||
InvalidArrayIndex_CRASH(aIndex, Length());
|
||||
}
|
||||
|
||||
// Length() + 1 is guaranteed to not overflow, so EnsureCapacity is OK.
|
||||
if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
|
||||
Length() + 1, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
|
@ -2500,6 +2512,7 @@ nsTArray_Impl<E, Alloc>::InsertElementAt(index_type aIndex, Item&& aItem) -> ele
|
|||
InvalidArrayIndex_CRASH(aIndex, Length());
|
||||
}
|
||||
|
||||
// Length() + 1 is guaranteed to not overflow, so EnsureCapacity is OK.
|
||||
if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
|
||||
Length() + 1, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
|
@ -2516,8 +2529,8 @@ template<class Item, typename ActualAlloc>
|
|||
auto
|
||||
nsTArray_Impl<E, Alloc>::AppendElements(const Item* aArray, size_type aArrayLen) -> elem_type*
|
||||
{
|
||||
if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
|
||||
Length() + aArrayLen, sizeof(elem_type)))) {
|
||||
if (!ActualAlloc::Successful(this->template ExtendCapacity<ActualAlloc>(
|
||||
Length(), aArrayLen, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
}
|
||||
index_type len = Length();
|
||||
|
@ -2539,8 +2552,8 @@ nsTArray_Impl<E, Alloc>::AppendElements(nsTArray_Impl<Item, Allocator>&& aArray)
|
|||
|
||||
index_type len = Length();
|
||||
index_type otherLen = aArray.Length();
|
||||
if (!Alloc::Successful(this->template EnsureCapacity<Alloc>(
|
||||
len + otherLen, sizeof(elem_type)))) {
|
||||
if (!Alloc::Successful(this->template ExtendCapacity<Alloc>(
|
||||
len, otherLen, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
}
|
||||
copy_type::MoveNonOverlappingRegion(Elements() + len, aArray.Elements(), otherLen,
|
||||
|
@ -2556,6 +2569,7 @@ template<class Item, typename ActualAlloc>
|
|||
auto
|
||||
nsTArray_Impl<E, Alloc>::AppendElement(Item&& aItem) -> elem_type*
|
||||
{
|
||||
// Length() + 1 is guaranteed to not overflow, so EnsureCapacity is OK.
|
||||
if (!ActualAlloc::Successful(this->template EnsureCapacity<ActualAlloc>(
|
||||
Length() + 1, sizeof(elem_type)))) {
|
||||
return nullptr;
|
||||
|
|
Загрузка…
Ссылка в новой задаче