Bug 1270126 - Avoid out of memory in safebrowsing::ByteSliceWrite. r=gcp

Switch over to using a single fallible array in ByteSliceWrite. This allows us
to only use 2 transient arrays 1/4 the size of the input array rather than 5
transient arrays.
This commit is contained in:
Eric Rahm
2016-05-05 17:37:27 -07:00
parent 27760661a1
commit b5eaad35ff

View File

@@ -650,33 +650,46 @@ nsresult InflateReadTArray(nsIInputStream* aStream, FallibleTArray<T>* aOut,
static nsresult
ByteSliceWrite(nsIOutputStream* aOut, nsTArray<uint32_t>& aData)
{
nsTArray<uint8_t> slice1;
nsTArray<uint8_t> slice2;
nsTArray<uint8_t> slice3;
nsTArray<uint8_t> slice4;
nsTArray<uint8_t> slice;
uint32_t count = aData.Length();
slice1.SetCapacity(count);
slice2.SetCapacity(count);
slice3.SetCapacity(count);
slice4.SetCapacity(count);
for (uint32_t i = 0; i < count; i++) {
slice1.AppendElement( aData[i] >> 24);
slice2.AppendElement((aData[i] >> 16) & 0xFF);
slice3.AppendElement((aData[i] >> 8) & 0xFF);
slice4.AppendElement( aData[i] & 0xFF);
// Only process one slice at a time to avoid using too much memory.
if (!slice.SetLength(count, fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
nsresult rv = DeflateWriteTArray(aOut, slice1);
// Process slice 1.
for (uint32_t i = 0; i < count; i++) {
slice[i] = (aData[i] >> 24);
}
nsresult rv = DeflateWriteTArray(aOut, slice);
NS_ENSURE_SUCCESS(rv, rv);
rv = DeflateWriteTArray(aOut, slice2);
// Process slice 2.
for (uint32_t i = 0; i < count; i++) {
slice[i] = ((aData[i] >> 16) & 0xFF);
}
rv = DeflateWriteTArray(aOut, slice);
NS_ENSURE_SUCCESS(rv, rv);
rv = DeflateWriteTArray(aOut, slice3);
// Process slice 3.
for (uint32_t i = 0; i < count; i++) {
slice[i] = ((aData[i] >> 8) & 0xFF);
}
rv = DeflateWriteTArray(aOut, slice);
NS_ENSURE_SUCCESS(rv, rv);
// Process slice 4.
for (uint32_t i = 0; i < count; i++) {
slice[i] = (aData[i] & 0xFF);
}
// The LSB slice is generally uncompressible, don't bother
// compressing it.
rv = WriteTArray(aOut, slice4);
rv = WriteTArray(aOut, slice);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;