From 8391e57b2709b95b7e679c86e738617d99686cd6 Mon Sep 17 00:00:00 2001 From: Fedor Date: Thu, 26 Nov 2020 05:42:11 +0200 Subject: [PATCH] [xpcom] Don't use realloc for shrinking nsTArrays when allowRealloc is false. --- xpcom/glue/nsTArray-inl.h | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/xpcom/glue/nsTArray-inl.h b/xpcom/glue/nsTArray-inl.h index 27fd38db0..2eaea8029 100644 --- a/xpcom/glue/nsTArray-inl.h +++ b/xpcom/glue/nsTArray-inl.h @@ -248,12 +248,28 @@ nsTArray_base::ShrinkCapacity(size_type aElemSize, return; } - size_type size = sizeof(Header) + length * aElemSize; - void* ptr = nsTArrayFallibleAllocator::Realloc(mHdr, size); - if (!ptr) { - return; + size_type newSize = sizeof(Header) + length * aElemSize; + + Header* newHeader; + if (!Copy::allowRealloc) { + // Malloc() and copy + newHeader = static_cast(nsTArrayFallibleAllocator::Malloc(newSize)); + if (!newHeader) { + return; + } + + Copy::MoveNonOverlappingRegionWithHeader(newHeader, mHdr, Length(), aElemSize); + + nsTArrayFallibleAllocator::Free(mHdr); + } else { + // Realloc() existing data + newHeader = static_cast(nsTArrayFallibleAllocator::Realloc(mHdr, newSize)); + if (!newHeader) { + return; + } } - mHdr = static_cast(ptr); + + mHdr = newHeader; mHdr->mCapacity = length; }