diff options
author | Mike Reed <reed@google.com> | 2018-01-05 11:20:10 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-05 21:29:35 +0000 |
commit | 8dc8dbc8211e7b0245a6e7db911265efbe0fccaf (patch) | |
tree | f112c74f618a536e86a80d9d657b804a039f3f54 /src | |
parent | f21b32ccd7bd174ce647078854b2314f8b64d94c (diff) |
begin cleanup of malloc porting layer
1. Merge some of the allocators into sk_malloc_flags by redefining a flag to mean zero-init
2. Add more private helpers to simplify our call-sites (and handle some overflow mul checks)
3. The 2-param helpers rely on the saturating SkSafeMath::Mul to pass max_size_t as the request,
which should always fail.
Bug:508641
Change-Id: I322f1e6ed91113467e0fdb12c91c3dad33d890c8
Reviewed-on: https://skia-review.googlesource.com/90940
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Stephan Altmueller <stephana@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkBmpBaseCodec.cpp | 2 | ||||
-rw-r--r-- | src/codec/SkIcoCodec.cpp | 5 | ||||
-rw-r--r-- | src/core/SkAutoMalloc.h | 2 | ||||
-rw-r--r-- | src/core/SkAutoPixmapStorage.cpp | 2 | ||||
-rw-r--r-- | src/core/SkBitmapCache.cpp | 2 | ||||
-rw-r--r-- | src/core/SkMallocPixelRef.cpp | 31 | ||||
-rw-r--r-- | src/core/SkRegion_path.cpp | 7 | ||||
-rw-r--r-- | src/gpu/GrBuffer.cpp | 2 | ||||
-rw-r--r-- | src/lazy/SkDiscardableMemoryPool.cpp | 2 | ||||
-rw-r--r-- | src/ports/SkMemory_malloc.cpp | 22 | ||||
-rw-r--r-- | src/ports/SkMemory_mozalloc.cpp | 20 |
11 files changed, 63 insertions, 34 deletions
diff --git a/src/codec/SkBmpBaseCodec.cpp b/src/codec/SkBmpBaseCodec.cpp index 1071ff38e7..c548514057 100644 --- a/src/codec/SkBmpBaseCodec.cpp +++ b/src/codec/SkBmpBaseCodec.cpp @@ -13,5 +13,5 @@ SkBmpBaseCodec::SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream> stream, uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder) : INHERITED(width, height, info, std::move(stream), bitsPerPixel, rowOrder) - , fSrcBuffer(sk_malloc_flags(this->srcRowBytes(), 0)) + , fSrcBuffer(sk_malloc_canfail(this->srcRowBytes())) {} diff --git a/src/codec/SkIcoCodec.cpp b/src/codec/SkIcoCodec.cpp index 1b9321c3ea..af9125565a 100644 --- a/src/codec/SkIcoCodec.cpp +++ b/src/codec/SkIcoCodec.cpp @@ -55,8 +55,7 @@ std::unique_ptr<SkCodec> SkIcoCodec::MakeFromStream(std::unique_ptr<SkStream> st uint32_t offset; uint32_t size; }; - SkAutoFree dirEntryBuffer(sk_malloc_flags(sizeof(Entry) * numImages, - SK_MALLOC_TEMP)); + SkAutoFree dirEntryBuffer(sk_malloc_canfail(sizeof(Entry) * numImages)); if (!dirEntryBuffer) { SkCodecPrintf("Error: OOM allocating ICO directory for %i images.\n", numImages); @@ -131,7 +130,7 @@ std::unique_ptr<SkCodec> SkIcoCodec::MakeFromStream(std::unique_ptr<SkStream> st bytesRead = offset; // Create a new stream for the embedded codec - SkAutoFree buffer(sk_malloc_flags(size, 0)); + SkAutoFree buffer(sk_malloc_canfail(size)); if (!buffer) { SkCodecPrintf("Warning: OOM trying to create embedded stream.\n"); break; diff --git a/src/core/SkAutoMalloc.h b/src/core/SkAutoMalloc.h index 03cbf79ea6..f5c872954d 100644 --- a/src/core/SkAutoMalloc.h +++ b/src/core/SkAutoMalloc.h @@ -144,7 +144,7 @@ public: SkASSERT(fPtr != fStorage); // otherwise we lied when setting didChangeAlloc. fPtr = fStorage; } else { - fPtr = sk_malloc_flags(size, SK_MALLOC_THROW | SK_MALLOC_TEMP); + fPtr = sk_malloc_throw(size); } fSize = size; diff --git a/src/core/SkAutoPixmapStorage.cpp b/src/core/SkAutoPixmapStorage.cpp index 47f41e7b92..72194233a8 100644 --- a/src/core/SkAutoPixmapStorage.cpp +++ b/src/core/SkAutoPixmapStorage.cpp @@ -40,7 +40,7 @@ bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) { if (SkImageInfo::ByteSizeOverflowed(size)) { return false; } - void* pixels = sk_malloc_flags(size, 0); + void* pixels = sk_malloc_canfail(size); if (nullptr == pixels) { return false; } diff --git a/src/core/SkBitmapCache.cpp b/src/core/SkBitmapCache.cpp index 210787e47d..cb88070ba4 100644 --- a/src/core/SkBitmapCache.cpp +++ b/src/core/SkBitmapCache.cpp @@ -301,7 +301,7 @@ SkBitmapCache::RecPtr SkBitmapCache::Alloc(const SkBitmapCacheDesc& desc, const if (factory) { dm.reset(factory(size)); } else { - block = sk_malloc_flags(size, 0); + block = sk_malloc_canfail(size); } if (!dm && !block) { return nullptr; diff --git a/src/core/SkMallocPixelRef.cpp b/src/core/SkMallocPixelRef.cpp index 6e402c98f7..2933e48cc4 100644 --- a/src/core/SkMallocPixelRef.cpp +++ b/src/core/SkMallocPixelRef.cpp @@ -8,8 +8,27 @@ #include "SkMallocPixelRef.h" #include "SkBitmap.h" #include "SkReadBuffer.h" +#include "SkSafeMath.h" #include "SkWriteBuffer.h" +void* sk_calloc_throw(size_t count, size_t elemSize) { + return sk_calloc_throw(SkSafeMath::Mul(count, elemSize)); +} + +void* sk_malloc_throw(size_t count, size_t elemSize) { + return sk_malloc_throw(SkSafeMath::Mul(count, elemSize)); +} + +void* sk_realloc_throw(void* buffer, size_t count, size_t elemSize) { + return sk_realloc_throw(buffer, SkSafeMath::Mul(count, elemSize)); +} + +void* sk_malloc_canfail(size_t count, size_t elemSize) { + return sk_malloc_canfail(SkSafeMath::Mul(count, elemSize)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + // assumes ptr was allocated via sk_malloc static void sk_free_releaseproc(void* ptr, void*) { sk_free(ptr); @@ -63,15 +82,13 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeUsing(void*(*allocProc)(size_t), sk_free_releaseproc, nullptr)); } -sk_sp<SkPixelRef> SkMallocPixelRef::MakeAllocate(const SkImageInfo& info, - size_t rowBytes) { - auto sk_malloc_nothrow = [](size_t size) { return sk_malloc_flags(size, 0); }; - return MakeUsing(sk_malloc_nothrow, info, rowBytes); +sk_sp<SkPixelRef> SkMallocPixelRef::MakeAllocate(const SkImageInfo& info, size_t rowBytes) { + return MakeUsing(sk_malloc_canfail, info, rowBytes); } sk_sp<SkPixelRef> SkMallocPixelRef::MakeZeroed(const SkImageInfo& info, size_t rowBytes) { - return MakeUsing(sk_calloc, info, rowBytes); + return MakeUsing(sk_calloc_canfail, info, rowBytes); } static void sk_data_releaseproc(void*, void* dataPtr) { @@ -93,8 +110,8 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeWithProc(const SkImageInfo& info, } sk_sp<SkPixelRef> SkMallocPixelRef::MakeWithData(const SkImageInfo& info, - size_t rowBytes, - sk_sp<SkData> data) { + size_t rowBytes, + sk_sp<SkData> data) { SkASSERT(data != nullptr); if (!is_valid(info)) { return nullptr; diff --git a/src/core/SkRegion_path.cpp b/src/core/SkRegion_path.cpp index fec78256b3..e6af059c8e 100644 --- a/src/core/SkRegion_path.cpp +++ b/src/core/SkRegion_path.cpp @@ -144,12 +144,7 @@ bool SkRgnBuilder::init(int maxHeight, int maxTransitions, bool pathIsInverse) { } fStorageCount = sk_64_asS32(count); - int64_t size = sk_64_mul(fStorageCount, sizeof(SkRegion::RunType)); - if (size < 0 || !sk_64_isS32(size)) { - return false; - } - - fStorage = (SkRegion::RunType*)sk_malloc_flags(sk_64_asS32(size), 0); + fStorage = (SkRegion::RunType*)sk_malloc_canfail(fStorageCount, sizeof(SkRegion::RunType)); if (nullptr == fStorage) { return false; } diff --git a/src/gpu/GrBuffer.cpp b/src/gpu/GrBuffer.cpp index c92b2968b9..cd7862a226 100644 --- a/src/gpu/GrBuffer.cpp +++ b/src/gpu/GrBuffer.cpp @@ -16,7 +16,7 @@ GrBuffer* GrBuffer::CreateCPUBacked(GrGpu* gpu, size_t sizeInBytes, GrBufferType if (gpu->caps()->mustClearUploadedBufferData()) { cpuData = sk_calloc_throw(sizeInBytes); } else { - cpuData = sk_malloc_flags(sizeInBytes, SK_MALLOC_THROW); + cpuData = sk_malloc_throw(sizeInBytes); } if (data) { memcpy(cpuData, data, sizeInBytes); diff --git a/src/lazy/SkDiscardableMemoryPool.cpp b/src/lazy/SkDiscardableMemoryPool.cpp index 6e5582a494..394e325707 100644 --- a/src/lazy/SkDiscardableMemoryPool.cpp +++ b/src/lazy/SkDiscardableMemoryPool.cpp @@ -164,7 +164,7 @@ void DiscardableMemoryPool::dumpDownTo(size_t budget) { } std::unique_ptr<SkDiscardableMemory> DiscardableMemoryPool::make(size_t bytes) { - SkAutoFree addr(sk_malloc_flags(bytes, 0)); + SkAutoFree addr(sk_malloc_canfail(bytes)); if (nullptr == addr) { return nullptr; } diff --git a/src/ports/SkMemory_malloc.cpp b/src/ports/SkMemory_malloc.cpp index 05c69d53ae..aa1cfacb47 100644 --- a/src/ports/SkMemory_malloc.cpp +++ b/src/ports/SkMemory_malloc.cpp @@ -54,10 +54,6 @@ void sk_out_of_memory(void) { #endif } -void* sk_malloc_throw(size_t size) { - return sk_malloc_flags(size, SK_MALLOC_THROW); -} - void* sk_realloc_throw(void* addr, size_t size) { return throw_on_failure(size, realloc(addr, size)); } @@ -69,7 +65,16 @@ void sk_free(void* p) { } void* sk_malloc_flags(size_t size, unsigned flags) { - void* p = malloc(size); + void* p; +#ifdef SK_SUPPORT_LEGACY_MALLOC_PORTING_LAYER + p = malloc(size); +#else + if (flags & SK_MALLOC_ZERO_INITIALIZE) { + p = calloc(size, 1); + } else { + p = malloc(size); + } +#endif if (flags & SK_MALLOC_THROW) { return throw_on_failure(size, p); } else { @@ -77,10 +82,15 @@ void* sk_malloc_flags(size_t size, unsigned flags) { } } +#ifdef SK_SUPPORT_LEGACY_MALLOC_PORTING_LAYER +void* sk_malloc_throw(size_t size) { + return sk_malloc_flags(size, SK_MALLOC_THROW); +} void* sk_calloc(size_t size) { return calloc(size, 1); } - void* sk_calloc_throw(size_t size) { return throw_on_failure(size, sk_calloc(size)); } +#endif + diff --git a/src/ports/SkMemory_mozalloc.cpp b/src/ports/SkMemory_mozalloc.cpp index bf5971ba07..e13b94612a 100644 --- a/src/ports/SkMemory_mozalloc.cpp +++ b/src/ports/SkMemory_mozalloc.cpp @@ -22,22 +22,28 @@ void sk_out_of_memory(void) { mozalloc_handle_oom(0); } -void* sk_malloc_throw(size_t size) { - return sk_malloc_flags(size, SK_MALLOC_THROW); +void sk_free(void* p) { + free(p); } void* sk_realloc_throw(void* addr, size_t size) { return moz_xrealloc(addr, size); } -void sk_free(void* p) { - free(p); -} - void* sk_malloc_flags(size_t size, unsigned flags) { +#ifndef SK_SUPPORT_LEGACY_MALLOC_PORTING_LAYER + if (flags & SK_MALLOC_ZERO_INITIALIZE) { + return (flags & SK_MALLOC_THROW) ? moz_xcalloc(size, 1) : calloc(size, 1); + } +#endif return (flags & SK_MALLOC_THROW) ? moz_xmalloc(size) : malloc(size); } +#ifdef SK_SUPPORT_LEGACY_MALLOC_PORTING_LAYER +void* sk_malloc_throw(size_t size) { + return sk_malloc_flags(size, SK_MALLOC_THROW); +} + void* sk_calloc(size_t size) { return calloc(size, 1); } @@ -45,3 +51,5 @@ void* sk_calloc(size_t size) { void* sk_calloc_throw(size_t size) { return moz_xcalloc(size, 1); } +#endif + |