From fec0581faaa7615ad6ea6ba7ddfde51a46dedad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Thu, 17 Oct 2024 20:54:11 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20YUV=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=88=9B=E5=BB=BA=E7=9A=84=E7=BC=93=E5=86=B2=E5=8C=BA?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 731a81357..be51f11d5 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -374,7 +374,8 @@ static void SetYUVDataInfoToPixelMap(unique_ptr &dstPixelMap) static int AllocPixelMapMemory(std::unique_ptr &dstMemory, int32_t &dstRowStride, const ImageInfo &dstImageInfo, bool useDMA) { - size_t bufferSize = static_cast(dstImageInfo.size.width) * static_cast(dstImageInfo.size.height) * + size_t bufferSize = IsYUV(dstImageInfo.pixelFormat) ? static_cast(PixelMap::GetYUVByteCount(dstImageInfo)) : + static_cast(dstImageInfo.size.width) * static_cast(dstImageInfo.size.height) * static_cast(ImageUtils::GetPixelBytes(dstImageInfo.pixelFormat)); if (bufferSize > UINT_MAX) { IMAGE_LOGE("[PixelMap]Create: pixelmap size too large: width = %{public}d, height = %{public}d", @@ -454,6 +455,7 @@ unique_ptr PixelMap::Create(const uint32_t *colors, uint32_t colorLeng nullptr); ImageUtils::DumpPixelMapIfDumpEnabled(dstPixelMap); SetYUVDataInfoToPixelMap(dstPixelMap); + ImageUtils::FlushSurfaceBuffer(dstPixelMap.get()); return dstPixelMap; } @@ -651,11 +653,7 @@ unique_ptr PixelMap::Create(const InitializationOptions &opts) IMAGE_LOGE("set image info fail"); return nullptr; } - uint32_t bufferSize = dstPixelMap->GetByteCount(); - if (bufferSize == 0) { - IMAGE_LOGE("calloc parameter bufferSize:[%{public}d] error.", bufferSize); - return nullptr; - } + std::unique_ptr dstMemory = nullptr; int32_t dstRowStride = 0; int errorCode = AllocPixelMapMemory(dstMemory, dstRowStride, dstImageInfo, opts.useDMA); @@ -683,6 +681,7 @@ unique_ptr PixelMap::Create(const InitializationOptions &opts) SetYUVDataInfoToPixelMap(dstPixelMap); } } + ImageUtils::FlushSurfaceBuffer(dstPixelMap.get()); return dstPixelMap; } -- Gitee From 37a67f41819cd8e2164e4f2f367ab8b2a1892434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 17:45:47 +0800 Subject: [PATCH 02/10] =?UTF-8?q?Revert=20"=E4=BF=AE=E5=A4=8D=20YUV=20?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=88=9B=E5=BB=BA=E7=9A=84=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E5=8C=BA=E5=A4=A7=E5=B0=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fec0581faaa7615ad6ea6ba7ddfde51a46dedad6. Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index be51f11d5..731a81357 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -374,8 +374,7 @@ static void SetYUVDataInfoToPixelMap(unique_ptr &dstPixelMap) static int AllocPixelMapMemory(std::unique_ptr &dstMemory, int32_t &dstRowStride, const ImageInfo &dstImageInfo, bool useDMA) { - size_t bufferSize = IsYUV(dstImageInfo.pixelFormat) ? static_cast(PixelMap::GetYUVByteCount(dstImageInfo)) : - static_cast(dstImageInfo.size.width) * static_cast(dstImageInfo.size.height) * + size_t bufferSize = static_cast(dstImageInfo.size.width) * static_cast(dstImageInfo.size.height) * static_cast(ImageUtils::GetPixelBytes(dstImageInfo.pixelFormat)); if (bufferSize > UINT_MAX) { IMAGE_LOGE("[PixelMap]Create: pixelmap size too large: width = %{public}d, height = %{public}d", @@ -455,7 +454,6 @@ unique_ptr PixelMap::Create(const uint32_t *colors, uint32_t colorLeng nullptr); ImageUtils::DumpPixelMapIfDumpEnabled(dstPixelMap); SetYUVDataInfoToPixelMap(dstPixelMap); - ImageUtils::FlushSurfaceBuffer(dstPixelMap.get()); return dstPixelMap; } @@ -653,7 +651,11 @@ unique_ptr PixelMap::Create(const InitializationOptions &opts) IMAGE_LOGE("set image info fail"); return nullptr; } - + uint32_t bufferSize = dstPixelMap->GetByteCount(); + if (bufferSize == 0) { + IMAGE_LOGE("calloc parameter bufferSize:[%{public}d] error.", bufferSize); + return nullptr; + } std::unique_ptr dstMemory = nullptr; int32_t dstRowStride = 0; int errorCode = AllocPixelMapMemory(dstMemory, dstRowStride, dstImageInfo, opts.useDMA); @@ -681,7 +683,6 @@ unique_ptr PixelMap::Create(const InitializationOptions &opts) SetYUVDataInfoToPixelMap(dstPixelMap); } } - ImageUtils::FlushSurfaceBuffer(dstPixelMap.get()); return dstPixelMap; } -- Gitee From 2ac6afc4ca03462bb9b9342a2423113257e57cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 18:43:20 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E6=BA=A2=E5=87=BA=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- .../innerkitsimpl/common/src/pixel_map.cpp | 59 +++++++++++-------- .../innerkitsimpl/utils/src/image_utils.cpp | 19 ++++-- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 7cf1a3710..9eb5bacf5 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -1068,18 +1068,21 @@ uint32_t PixelMap::SetImageInfo(ImageInfo &info) uint32_t PixelMap::SetRowDataSizeForImageInfo(ImageInfo info) { - uint32_t infoWidth = static_cast(info.size.width); + uint64_t infoWidth = static_cast(info.size.width); + uint64_t pixelBytes = static_cast(pixelBytes_); + uint64_t rowDataSize = 0; if (info.pixelFormat == PixelFormat::ALPHA_8) { - rowDataSize_ = pixelBytes_ * ((info.size.width + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); - SetRowStride(rowDataSize_); - IMAGE_LOGI("ALPHA_8 rowDataSize_ %{public}d.", rowDataSize_); + rowDataSize = pixelBytes * ((infoWidth + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); + SetRowStride(static_cast(rowDataSize)); + IMAGE_LOGI("ALPHA_8 rowDataSize %{public}llu.", static_cast(rowDataSize)); } else if (info.pixelFormat == PixelFormat::ASTC_4x4) { - rowDataSize_ = pixelBytes_ * (((infoWidth + NUM_3) >> NUM_2) << NUM_2); + rowDataSize = pixelBytes * (((infoWidth + NUM_3) >> NUM_2) << NUM_2); } else if (info.pixelFormat == PixelFormat::ASTC_6x6) { - rowDataSize_ = pixelBytes_ * (((info.size.width + NUM_5) / NUM_6) * NUM_6); + rowDataSize = pixelBytes * (((infoWidth + NUM_5) / NUM_6) * NUM_6); } else if (info.pixelFormat == PixelFormat::ASTC_8x8) { - rowDataSize_ = pixelBytes_ * (((infoWidth + NUM_7) >> NUM_3) << NUM_3); + rowDataSize = pixelBytes * (((infoWidth + NUM_7) >> NUM_3) << NUM_3); } else { + rowDataSize = pixelBytes * info.size.width; #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) if (allocatorType_ == AllocatorType::DMA_ALLOC) { if (context_ == nullptr) { @@ -1089,13 +1092,16 @@ uint32_t PixelMap::SetRowDataSizeForImageInfo(ImageInfo info) SurfaceBuffer* sbBuffer = reinterpret_cast(context_); SetRowStride(sbBuffer->GetStride()); } else { - SetRowStride(pixelBytes_ * info.size.width); + SetRowStride(static_cast(rowDataSize)); } #else - SetRowStride(pixelBytes_ * info.size.width); + SetRowStride(static_cast(rowDataSize)); #endif - rowDataSize_ = pixelBytes_ * info.size.width; } + if (rowDataSize > INT_MAX) { + IMAGE_LOGE("set imageInfo failed, rowDataSize overflowed"); + } + rowDataSize_ = static_cast(rowDataSize); return SUCCESS; } @@ -1115,9 +1121,10 @@ uint32_t PixelMap::SetImageInfo(ImageInfo &info, bool isReused) return ERR_IMAGE_DATA_ABNORMAL; } - uint64_t totalSize = static_cast(info.size.width) * static_cast(info.size.height) * - static_cast(pixelBytes_); - if ((allocatorType_ == AllocatorType::HEAP_ALLOC && totalSize > PIXEL_MAP_MAX_RAM_SIZE) || totalSize > INT_MAX) { + uint64_t totalPixels = static_cast(info.size.width) * static_cast(info.size.height); + uint64_t totalSize = totalPixels * static_cast(pixelBytes_); + if ((allocatorType_ == AllocatorType::HEAP_ALLOC && totalSize > PIXEL_MAP_MAX_RAM_SIZE) || + totalPixels > INT_MAX || totalSize > INT_MAX) { ResetPixelMap(); IMAGE_LOGE("image size is out of range."); return ERR_IMAGE_TOO_LARGE; @@ -1383,7 +1390,11 @@ int32_t PixelMap::GetByteCount() if (IsYUV(imageInfo_.pixelFormat)) { return GetYUVByteCount(imageInfo_); } else { - return rowDataSize_ * imageInfo_.size.height; + uint64_t byteCount = static_cast(rowDataSize_) * static_cast(imageInfo_.size.height); + if (byteCount > INT_MAX) { + return 0; + } + return byteCount; } } @@ -2539,9 +2550,9 @@ bool PixelMap::ReadPropertiesFromParcel(Parcel &parcel, ImageInfo &imgInfo, SetVersionId(versionId); bufferSize = parcel.ReadInt32(); int32_t bytesPerPixel = ImageUtils::GetPixelBytes(imgInfo.pixelFormat); - uint64_t totalSize = static_cast(imgInfo.size.width) * static_cast(imgInfo.size.height) * - static_cast(bytesPerPixel); - if (bytesPerPixel == 0 || rowDataSize == 0 || totalSize > INT_MAX || + uint64_t totalPixels = static_cast(imgInfo.size.width) * static_cast(imgInfo.size.height); + uint64_t totalSize = totalPixels * static_cast(bytesPerPixel); + if (bytesPerPixel == 0 || rowDataSize <= 0 || totalPixels > INT_MAX || totalSize > INT_MAX || (allocatorType == AllocatorType::HEAP_ALLOC && totalSize > PIXEL_MAP_MAX_RAM_SIZE) || rowDataSize != ImageUtils::GetRowDataSizeByPixelFormat(imgInfo.size.width, imgInfo.pixelFormat)) { IMAGE_LOGE("ReadPropertiesFromParcel bytesPerPixel or rowDataSize (%{public}d) or totalSize (%{public}llu) " @@ -2551,12 +2562,12 @@ bool PixelMap::ReadPropertiesFromParcel(Parcel &parcel, ImageInfo &imgInfo, return false; } - int32_t expectedBufferSize = rowDataSize * imgInfo.size.height; + uint64_t expectedBufferSize = static_cast(rowDataSize) * static_cast(imgInfo.size.height); if (isAstc) { expectedBufferSize = ImageUtils::GetAstcBytesCount(imgInfo); } if (!IsYUV(imgInfo.pixelFormat) && imgInfo.pixelFormat != PixelFormat::RGBA_F16 && - bufferSize != expectedBufferSize) { + static_cast(bufferSize) != expectedBufferSize) { IMAGE_LOGE("ReadPropertiesFromParcel bufferSize invalid"); PixelMap::ConstructPixelMapError(error, ERR_IMAGE_PIXELMAP_CREATE_FAILED, "bufferSize invalid"); return false; @@ -2873,14 +2884,14 @@ bool PixelMap::EncodeTlv(std::vector &buff) const WriteVarint(buff, static_cast(tmpAllocatorType)); WriteUint8(buff, TLV_IMAGE_DATA); const uint8_t *data = data_; - int32_t dataSize = rowDataSize_ * imageInfo_.size.height; - if (data == nullptr || size_t(dataSize) > MAX_IMAGEDATA_SIZE || dataSize <= 0) { + uint64_t dataSize = static_cast(rowDataSize_) * static_cast(imageInfo_.size.height); + if (data == nullptr || dataSize > MAX_IMAGEDATA_SIZE) { WriteVarint(buff, 0); // L is zero and no value WriteUint8(buff, TLV_END); // end tag IMAGE_LOGE("pixel map tlv encode fail: no data"); return false; } - WriteVarint(buff, dataSize); + WriteVarint(buff, static_cast(dataSize)); WriteData(buff, data, imageInfo_.size.height, rowDataSize_, rowStride_); WriteUint8(buff, TLV_END); // end tag return true; @@ -2944,9 +2955,9 @@ PixelMap *PixelMap::DecodeTlv(std::vector &buff) uint8_t *data = nullptr; int32_t allocType = static_cast(AllocatorType::DEFAULT); ReadTlvAttr(buff, imageInfo, allocType, dataSize, &data); - if (data == nullptr) { + if (data == nullptr || allocType != static_cast(AllocatorType::HEAP_ALLOC)) { delete pixelMap; - IMAGE_LOGE("pixel map tlv decode fail: no data"); + IMAGE_LOGE("pixel map tlv decode fail: no data or invalid allocType"); return nullptr; } uint32_t ret = pixelMap->SetImageInfo(imageInfo); diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index 199a43d06..761aace1d 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -188,19 +188,26 @@ int32_t ImageUtils::GetPixelBytes(const PixelFormat &pixelFormat) int32_t ImageUtils::GetRowDataSizeByPixelFormat(int32_t width, PixelFormat format) { - int32_t pixelBytes = GetPixelBytes(format); + uint64_t widthU = static_cast(width); + uint64_t pixelBytes = static_cast(GetPixelBytes(format)); + uint64_t rowDataSize = 0; switch (format) { case PixelFormat::ALPHA_8: - return pixelBytes * ((width + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); + rowDataSize = pixelBytes * ((widthU + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); case PixelFormat::ASTC_4x4: - return pixelBytes * (((static_cast(width) + NUM_3) >> NUM_2) << NUM_2); + rowDataSize = pixelBytes * (((widthU + NUM_3) >> NUM_2) << NUM_2); case PixelFormat::ASTC_6x6: - return pixelBytes * (((width + NUM_5) / NUM_6) * NUM_6); + rowDataSize = pixelBytes * (((widthU + NUM_5) / NUM_6) * NUM_6); case PixelFormat::ASTC_8x8: - return pixelBytes * (((static_cast(width) + NUM_7) >> NUM_3) << NUM_3); + rowDataSize = pixelBytes * (((widthU + NUM_7) >> NUM_3) << NUM_3); default: - return pixelBytes * width; + rowDataSize = pixelBytes * width; } + if (rowDataSize > INT_MAX) { + IMAGE_LOGE("GetRowDataSizeByPixelFormat failed: rowDataSize overflowed"); + return 0; + } + return static_cast(rowDataSize); } uint32_t ImageUtils::RegisterPluginServer() -- Gitee From d639db16776b8c77b709f936b174faa565a75f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 18:52:42 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 9eb5bacf5..a940cf425 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -2884,14 +2884,15 @@ bool PixelMap::EncodeTlv(std::vector &buff) const WriteVarint(buff, static_cast(tmpAllocatorType)); WriteUint8(buff, TLV_IMAGE_DATA); const uint8_t *data = data_; - uint64_t dataSize = static_cast(rowDataSize_) * static_cast(imageInfo_.size.height); - if (data == nullptr || dataSize > MAX_IMAGEDATA_SIZE) { + int32_t dataSize = rowDataSize_ * imageInfo_.size.height; + if (data == nullptr || size_t(dataSize) > MAX_IMAGEDATA_SIZE || dataSize <= 0 || + imageInfo_.size.height > dataSize / rowDataSize_) { WriteVarint(buff, 0); // L is zero and no value WriteUint8(buff, TLV_END); // end tag - IMAGE_LOGE("pixel map tlv encode fail: no data"); + IMAGE_LOGE("pixel map tlv encode fail: no data or invalid dataSize"); return false; } - WriteVarint(buff, static_cast(dataSize)); + WriteVarint(buff, dataSize); WriteData(buff, data, imageInfo_.size.height, rowDataSize_, rowStride_); WriteUint8(buff, TLV_END); // end tag return true; -- Gitee From dc4516e56bb2d8bb42a47462cce7da3ae85fd245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 19:07:16 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index d918aacd2..0d68b36c1 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -1075,7 +1075,7 @@ uint32_t PixelMap::SetRowDataSizeForImageInfo(ImageInfo info) uint64_t rowDataSize = 0; if (info.pixelFormat == PixelFormat::ALPHA_8) { rowDataSize = pixelBytes * ((infoWidth + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); - SetRowStride(static_cast(rowDataSize)); + SetRowStride(static_cast(rowDataSize)); IMAGE_LOGI("ALPHA_8 rowDataSize %{public}llu.", static_cast(rowDataSize)); } else if (info.pixelFormat == PixelFormat::ASTC_4x4) { rowDataSize = pixelBytes * (((infoWidth + NUM_3) >> NUM_2) << NUM_2); @@ -1102,6 +1102,7 @@ uint32_t PixelMap::SetRowDataSizeForImageInfo(ImageInfo info) } if (rowDataSize > INT_MAX) { IMAGE_LOGE("set imageInfo failed, rowDataSize overflowed"); + return ERR_IMAGE_DATA_ABNORMAL; } rowDataSize_ = static_cast(rowDataSize); return SUCCESS; -- Gitee From d3b52b4963c399b5d03f4559c7df3e3e15d7deef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 19:37:02 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 0d68b36c1..7eb2e6aaf 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -2889,7 +2889,7 @@ bool PixelMap::EncodeTlv(std::vector &buff) const const uint8_t *data = data_; int32_t dataSize = rowDataSize_ * imageInfo_.size.height; if (isUnMap_ || data == nullptr || size_t(dataSize) > MAX_IMAGEDATA_SIZE || dataSize <= 0 || - imageInfo_.size.height > dataSize / rowDataSize_) { + (rowDataSize != 0 && imageInfo_.size.height > dataSize / rowDataSize_)) { WriteVarint(buff, 0); // L is zero and no value WriteUint8(buff, TLV_END); // end tag IMAGE_LOGE("pixel map tlv encode fail: no data or invalid dataSize, isUnMap %{public}d", isUnMap_); -- Gitee From 0588a649cbf0b1047e3e3049151219287afdf609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 19:47:42 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 7eb2e6aaf..0f73b4093 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -2889,7 +2889,7 @@ bool PixelMap::EncodeTlv(std::vector &buff) const const uint8_t *data = data_; int32_t dataSize = rowDataSize_ * imageInfo_.size.height; if (isUnMap_ || data == nullptr || size_t(dataSize) > MAX_IMAGEDATA_SIZE || dataSize <= 0 || - (rowDataSize != 0 && imageInfo_.size.height > dataSize / rowDataSize_)) { + (rowDataSize_ != 0 && imageInfo_.size.height > dataSize / rowDataSize_)) { WriteVarint(buff, 0); // L is zero and no value WriteUint8(buff, TLV_END); // end tag IMAGE_LOGE("pixel map tlv encode fail: no data or invalid dataSize, isUnMap %{public}d", isUnMap_); -- Gitee From 0b649ff90824048cf4da676d0de7f89c693384fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 19:52:23 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 2 +- frameworks/innerkitsimpl/utils/src/image_utils.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index 0f73b4093..a7f6bcae6 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -1084,7 +1084,7 @@ uint32_t PixelMap::SetRowDataSizeForImageInfo(ImageInfo info) } else if (info.pixelFormat == PixelFormat::ASTC_8x8) { rowDataSize = pixelBytes * (((infoWidth + NUM_7) >> NUM_3) << NUM_3); } else { - rowDataSize = pixelBytes * info.size.width; + rowDataSize = pixelBytes * infoWidth; #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) if (allocatorType_ == AllocatorType::DMA_ALLOC) { if (context_ == nullptr) { diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index 761aace1d..e6f434560 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -201,7 +201,7 @@ int32_t ImageUtils::GetRowDataSizeByPixelFormat(int32_t width, PixelFormat forma case PixelFormat::ASTC_8x8: rowDataSize = pixelBytes * (((widthU + NUM_7) >> NUM_3) << NUM_3); default: - rowDataSize = pixelBytes * width; + rowDataSize = pixelBytes * widthU; } if (rowDataSize > INT_MAX) { IMAGE_LOGE("GetRowDataSizeByPixelFormat failed: rowDataSize overflowed"); -- Gitee From 02f109a6010b4579aa6ebd649d0f1e6344eabc7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 20:16:40 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/common/src/pixel_map.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/innerkitsimpl/common/src/pixel_map.cpp b/frameworks/innerkitsimpl/common/src/pixel_map.cpp index a7f6bcae6..5ce533276 100644 --- a/frameworks/innerkitsimpl/common/src/pixel_map.cpp +++ b/frameworks/innerkitsimpl/common/src/pixel_map.cpp @@ -1395,6 +1395,7 @@ int32_t PixelMap::GetByteCount() } else { uint64_t byteCount = static_cast(rowDataSize_) * static_cast(imageInfo_.size.height); if (byteCount > INT_MAX) { + IMAGE_LOGE("GetByteCount failed: byteCount overflowed"); return 0; } return byteCount; -- Gitee From 5bf3d7deb76c0b6921a42ab3cb45442ab4e77e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E4=B9=94=E5=BC=82?= Date: Mon, 21 Oct 2024 21:02:52 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈乔异 --- frameworks/innerkitsimpl/utils/src/image_utils.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index e6f434560..cf3384dc4 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -194,12 +194,16 @@ int32_t ImageUtils::GetRowDataSizeByPixelFormat(int32_t width, PixelFormat forma switch (format) { case PixelFormat::ALPHA_8: rowDataSize = pixelBytes * ((widthU + FILL_NUMBER) / ALIGN_NUMBER * ALIGN_NUMBER); + break; case PixelFormat::ASTC_4x4: rowDataSize = pixelBytes * (((widthU + NUM_3) >> NUM_2) << NUM_2); + break; case PixelFormat::ASTC_6x6: rowDataSize = pixelBytes * (((widthU + NUM_5) / NUM_6) * NUM_6); + break; case PixelFormat::ASTC_8x8: rowDataSize = pixelBytes * (((widthU + NUM_7) >> NUM_3) << NUM_3); + break; default: rowDataSize = pixelBytes * widthU; } -- Gitee