[Tizen] Fix svace phase 2 : Print error log when malloc failed 36/307036/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 4 Mar 2024 01:43:17 +0000 (10:43 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 4 Mar 2024 05:46:11 +0000 (14:46 +0900)
Let we print error log if malloc failed.

There was some codes that we assume malloc success always.
This is not safe. So we have to add some guard codes for malloc failed cases.

Change-Id: Ie2f3500258ba2c33a3df1adf492d56f3235048f1
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
17 files changed:
dali/devel-api/text-abstraction/glyph-buffer-data.cpp
dali/internal/graphics/gles-impl/egl-graphics-controller.cpp
dali/internal/graphics/gles-impl/gles-graphics-buffer.cpp
dali/internal/graphics/gles-impl/gles2-graphics-memory.cpp
dali/internal/imaging/common/gif-loading.cpp
dali/internal/imaging/common/image-operations.cpp
dali/internal/imaging/common/loader-jpeg-turbo.cpp
dali/internal/imaging/common/loader-png.cpp
dali/internal/imaging/common/pixel-buffer-impl.cpp
dali/internal/imaging/common/webp-loading.cpp
dali/internal/text/text-abstraction/bidirectional-support-impl.cpp
dali/internal/text/text-abstraction/cairo-renderer.cpp
dali/internal/text/text-abstraction/hyphenation-impl.cpp
dali/internal/text/text-abstraction/plugin/embedded-item.cpp
dali/internal/text/text-abstraction/plugin/font-client-plugin-impl.cpp
dali/internal/text/text-abstraction/plugin/font-client-utils.cpp
dali/internal/text/text-abstraction/plugin/font-face-glyph-cache-manager.cpp

index fec3884dbc1ed8e2fc5f6e876500e0c8e8b44a87..39a3a34375d8619a70009b4e3cf35a41372ce161 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -97,6 +97,7 @@ size_t GlyphBufferData::Compress(const uint8_t* const __restrict__ inBuffer, Gly
       compressedBuffer = (uint8_t*)malloc(bufferSize);
       if(DALI_UNLIKELY(compressedBuffer == nullptr))
       {
+        DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", bufferSize);
         return 0u;
       }
       outBufferData.isBufferOwned = true;
@@ -116,6 +117,7 @@ size_t GlyphBufferData::Compress(const uint8_t* const __restrict__ inBuffer, Gly
       compressedBuffer = (uint8_t*)malloc(bufferSize);
       if(DALI_UNLIKELY(compressedBuffer == nullptr))
       {
+        DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", bufferSize);
         return 0u;
       }
       outBufferData.isBufferOwned = true;
@@ -148,6 +150,7 @@ size_t GlyphBufferData::Compress(const uint8_t* const __restrict__ inBuffer, Gly
       uint8_t* __restrict__ tempBuffer = (uint8_t*)malloc(outBufferData.height * (widthByte + 1));
       if(DALI_UNLIKELY(tempBuffer == nullptr))
       {
+        DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", outBufferData.height * (widthByte + 1));
         return 0u;
       }
 
@@ -294,6 +297,7 @@ size_t GlyphBufferData::Compress(const uint8_t* const __restrict__ inBuffer, Gly
       compressedBuffer = (uint8_t*)malloc(bufferSize);
       if(DALI_UNLIKELY(compressedBuffer == nullptr))
       {
+        DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", bufferSize);
         free(tempBuffer);
         return 0u;
       }
index 2d815710c3cfc724295263de7303d09d8aa02903..d0719f60f30a0eeb2f99a78481332f34ee340768 100644 (file)
@@ -934,11 +934,18 @@ void EglGraphicsController::UpdateTextures(const std::vector<TextureUpdateInfo>&
 
         uint8_t* stagingBuffer = reinterpret_cast<uint8_t*>(malloc(info.srcSize));
 
-        uint8_t* srcMemory = &reinterpret_cast<uint8_t*>(source.memorySource.memory)[info.srcOffset];
+        if(DALI_UNLIKELY(stagingBuffer == nullptr))
+        {
+          DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", info.srcSize);
+        }
+        else
+        {
+          uint8_t* srcMemory = &reinterpret_cast<uint8_t*>(source.memorySource.memory)[info.srcOffset];
 
-        std::copy(srcMemory, srcMemory + info.srcSize, stagingBuffer);
+          std::copy(srcMemory, srcMemory + info.srcSize, stagingBuffer);
 
-        mTextureUploadTotalCPUMemoryUsed += info.srcSize;
+          mTextureUploadTotalCPUMemoryUsed += info.srcSize;
+        }
 
         // store staging buffer
         source.memorySource.memory = stagingBuffer;
index f41ca6cab94db48e469b2210667675006fd60abc..d2fbaaf32823e12114c4a7e2afccffbde481f950 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,11 +56,11 @@ bool Buffer::TryRecycle(const Graphics::BufferCreateInfo& createInfo, Graphics::
   mSetForGLRecycling = false;
 
   // if different buffer spec, we need new buffer
-  if(!(createInfo.size == mCreateInfo.size
-     && createInfo.allocationCallbacks == mCreateInfo.allocationCallbacks
-     && createInfo.propertiesFlags == mCreateInfo.propertiesFlags
-     && createInfo.usage == mCreateInfo.usage
-     && createInfo.nextExtension == mCreateInfo.nextExtension ))
+  if(!(createInfo.size == mCreateInfo.size &&
+       createInfo.allocationCallbacks == mCreateInfo.allocationCallbacks &&
+       createInfo.propertiesFlags == mCreateInfo.propertiesFlags &&
+       createInfo.usage == mCreateInfo.usage &&
+       createInfo.nextExtension == mCreateInfo.nextExtension))
   {
     return false;
   }
@@ -116,6 +116,10 @@ void Buffer::InitializeCPUBuffer()
   else
   {
     mBufferPtr = malloc(mCreateInfo.size);
+    if(DALI_UNLIKELY(mBufferPtr == nullptr))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", mCreateInfo.size);
+    }
   }
 }
 
index 92b4ef01ffdab6e8162508234d82ebb698472126..6ad22f8c47d06af32bf59e0986272bcec640a9c2 100644 (file)
@@ -63,8 +63,12 @@ void* Memory2::LockRegion(uint32_t offset, uint32_t size)
     }
     else
     {
-      auto retval         = malloc(size);
-      mMappedPointer      = retval;
+      auto retval    = malloc(size);
+      mMappedPointer = retval;
+      if(DALI_UNLIKELY(mMappedPointer == nullptr))
+      {
+        DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", size);
+      }
       mIsAllocatedLocally = true;
     }
   }
index 37d8109135311cd6b21a2e48eabb97dd8fab53a1..c35899aec2cd9be48b577a92e401136cd39fbef1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -315,8 +315,13 @@ bool LoaderInfo::FileData::LoadLocalFile()
 
   if(DALI_LIKELY(!fseek(fp, 0, SEEK_SET)))
   {
-    globalMap = reinterpret_cast<GifByteType*>(malloc(sizeof(GifByteType) * length));
-    length    = fread(globalMap, sizeof(GifByteType), length, fp);
+    globalMap = reinterpret_cast<GifByteType*>(malloc(sizeof(GifByteType) * static_cast<unsigned long long>(length)));
+    if(DALI_UNLIKELY(globalMap == nullptr))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %llu\n", sizeof(GifByteType) * static_cast<unsigned long long>(length));
+      return false;
+    }
+    length = fread(globalMap, sizeof(GifByteType), length, fp);
   }
   else
   {
@@ -346,8 +351,15 @@ bool LoaderInfo::FileData::LoadRemoteFile()
         if(DALI_LIKELY(!fseek(fp, 0, SEEK_SET)))
         {
           globalMap = reinterpret_cast<GifByteType*>(malloc(sizeof(GifByteType) * blobSize));
-          length    = fread(globalMap, sizeof(GifByteType), blobSize, fp);
-          succeeded = true;
+          if(DALI_UNLIKELY(globalMap == nullptr))
+          {
+            DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", sizeof(GifByteType) * blobSize);
+          }
+          else
+          {
+            length    = fread(globalMap, sizeof(GifByteType), blobSize, fp);
+            succeeded = true;
+          }
         }
         else
         {
index f4863ab5e5d9ff8df37390b3adf1e4607a36e203..93b23ddbd252f9e9fe8659799cf906facec7a337 100644 (file)
@@ -529,6 +529,7 @@ bool Rotate90(const uint8_t* const pixelsIn,
   pixelsOut = static_cast<uint8_t*>(malloc(widthOut * heightOut * pixelSize));
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
@@ -587,6 +588,7 @@ bool Rotate180(const uint8_t* const pixelsIn,
   pixelsOut = static_cast<uint8_t*>(malloc(widthIn * heightIn * pixelSize));
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthIn, heightIn, pixelSize);
     // Return if the memory allocations fails.
     return false;
   }
@@ -650,6 +652,7 @@ bool Rotate270(const uint8_t* const pixelsIn,
   pixelsOut = static_cast<uint8_t*>(malloc(widthOut * heightOut * pixelSize));
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
@@ -2557,6 +2560,7 @@ void RotateByShear(const uint8_t* const pixelsIn,
 
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
@@ -2595,6 +2599,7 @@ void RotateByShear(const uint8_t* const pixelsIn,
 
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
@@ -2632,6 +2637,7 @@ void RotateByShear(const uint8_t* const pixelsIn,
 
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
@@ -2685,6 +2691,7 @@ void HorizontalShear(const uint8_t* const pixelsIn,
 
   if(nullptr == pixelsOut)
   {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
     widthOut  = 0u;
     heightOut = 0u;
 
index 7a7f42b8fc4783d648f37d5b0b49183aed3db61b..5bf488daaf0bc263870fbc5c7aba14e68245be45 100644 (file)
@@ -894,7 +894,7 @@ bool DecodeJpeg(const Dali::ImageLoader::Input& input, std::vector<Dali::Devel::
       auto planeSize = tjPlaneSizeYUV(i, scaledPostXformWidth, 0, scaledPostXformHeight, chrominanceSubsampling);
 
       uint8_t* buffer = static_cast<uint8_t*>(malloc(planeSize));
-      if(!buffer)
+      if(DALI_UNLIKELY(!buffer))
       {
         DALI_LOG_ERROR("Buffer allocation is failed [%d]\n", planeSize);
         pixelBuffers.clear();
@@ -982,6 +982,12 @@ bool DecodeJpeg(const Dali::ImageLoader::Input& input, std::vector<Dali::Devel::
 
       uint8_t* cmykBuffer = static_cast<uint8_t*>(malloc(sizeof(uint8_t) * scaledPostXformWidth * scaledPostXformHeight * cmykBytesPerPixel));
 
+      if(DALI_UNLIKELY(!cmykBuffer))
+      {
+        DALI_LOG_ERROR("cmykBuffer allocation is failed [%zu]\n", sizeof(uint8_t) * scaledPostXformWidth * scaledPostXformHeight * cmykBytesPerPixel);
+        return false;
+      }
+
       decodeResult = tjDecompress2(jpeg.get(), jpegBufferPtr, jpegBufferSize, reinterpret_cast<uint8_t*>(cmykBuffer), scaledPreXformWidth, 0, scaledPreXformHeight, pixelLibJpegType, flags);
       if(DALI_UNLIKELY(decodeResult == -1 && IsJpegDecodingFailed()))
       {
index 8351aa720fd379fdc5b843477643f6fed28e0298..fa855db1b5865f14aff7b0866b6b5e2ac5c25576 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -315,7 +315,7 @@ bool LoadBitmapFromPng(const Dali::ImageLoader::Input& input, Dali::Devel::Pixel
   rows = reinterpret_cast<png_bytep*>(malloc(sizeof(png_bytep) * height));
   if(DALI_UNLIKELY(!rows))
   {
-    DALI_LOG_ERROR("malloc is failed\n");
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", sizeof(png_bytep) * height);
     return false;
   }
 
index 3afdce5288bf7688036a3b56e620d117c085cb9a..0ed142e5c505202c8d14f8e6f03c66539989dbd1 100644 (file)
@@ -84,6 +84,10 @@ PixelBufferPtr PixelBuffer::New(uint32_t            width,
   if(bufferSize > 0)
   {
     buffer = static_cast<uint8_t*>(malloc(bufferSize));
+    if(DALI_UNLIKELY(!buffer))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", bufferSize);
+    }
 #if defined(DEBUG_ENABLED)
     gPixelBufferAllocationTotal += bufferSize;
 #endif
@@ -180,6 +184,11 @@ Dali::PixelData PixelBuffer::CreatePixelData() const
   if(mBufferSize > 0)
   {
     destBuffer = static_cast<uint8_t*>(malloc(mBufferSize));
+    if(DALI_UNLIKELY(!destBuffer))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", mBufferSize);
+      return Dali::PixelData();
+    }
     memcpy(destBuffer, mBuffer, mBufferSize);
   }
 
@@ -264,6 +273,10 @@ void PixelBuffer::AllocateFixedSize(uint32_t size)
   ReleaseBuffer();
   mBuffer     = reinterpret_cast<unsigned char*>(malloc(size));
   mBufferSize = size;
+  if(DALI_UNLIKELY(!mBuffer))
+  {
+    DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", mBufferSize);
+  }
 #if defined(DEBUG_ENABLED)
   gPixelBufferAllocationTotal += size;
 #endif
index 0dd3c853ecbecf078aa6dd9f544e869b4b94de62..24f150650492b4449683a869e70c490b6ca46033 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -206,7 +206,12 @@ public:
 
       if(DALI_LIKELY(!fseek(fp, 0, SEEK_SET)))
       {
-        mBuffer     = reinterpret_cast<WebPByteType*>(malloc(sizeof(WebPByteType) * mBufferSize));
+        mBuffer = reinterpret_cast<WebPByteType*>(malloc(sizeof(WebPByteType) * mBufferSize));
+        if(DALI_UNLIKELY(!mBuffer))
+        {
+          DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", sizeof(WebPByteType) * mBufferSize);
+          return false;
+        }
         mBufferSize = fread(mBuffer, sizeof(WebPByteType), mBufferSize, fp);
         return true;
       }
@@ -337,7 +342,7 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex, ImageDimens
 
         if(desiredSize.GetWidth() > 0 && desiredSize.GetHeight() > 0)
         {
-          const int desiredWidth = desiredSize.GetWidth();
+          const int desiredWidth  = desiredSize.GetWidth();
           const int desiredHeight = desiredSize.GetHeight();
 
           WebPDecoderConfig config;
@@ -348,8 +353,8 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex, ImageDimens
           }
 
           // Apply config for scaling
-          config.options.use_scaling = 1;
-          config.options.scaled_width = desiredWidth;
+          config.options.use_scaling   = 1;
+          config.options.scaled_width  = desiredWidth;
           config.options.scaled_height = desiredHeight;
 
           if(channelNumber == 4)
@@ -372,9 +377,9 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex, ImageDimens
 
           if(frameBuffer != nullptr)
           {
-            Pixel::Format                     pixelFormat = (channelNumber == 4) ? Pixel::RGBA8888 : Pixel::RGB888;
-            int32_t                           bufferSize  = desiredWidth * desiredHeight * Dali::Pixel::GetBytesPerPixel(pixelFormat);
-            pixelBuffer  = Dali::Devel::PixelBuffer::New(desiredWidth, desiredHeight, pixelFormat);
+            Pixel::Format pixelFormat = (channelNumber == 4) ? Pixel::RGBA8888 : Pixel::RGB888;
+            int32_t       bufferSize  = desiredWidth * desiredHeight * Dali::Pixel::GetBytesPerPixel(pixelFormat);
+            pixelBuffer               = Dali::Devel::PixelBuffer::New(desiredWidth, desiredHeight, pixelFormat);
             memcpy(pixelBuffer.GetBuffer(), frameBuffer, bufferSize);
           }
 
@@ -395,9 +400,8 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex, ImageDimens
           {
             Pixel::Format                     pixelFormat = (channelNumber == 4) ? Pixel::RGBA8888 : Pixel::RGB888;
             int32_t                           bufferSize  = width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat);
-            Internal::Adaptor::PixelBufferPtr internal =
-            Internal::Adaptor::PixelBuffer::New(frameBuffer, bufferSize, width, height, width, pixelFormat);
-            pixelBuffer = Devel::PixelBuffer(internal.Get());
+            Internal::Adaptor::PixelBufferPtr internal    = Internal::Adaptor::PixelBuffer::New(frameBuffer, bufferSize, width, height, width, pixelFormat);
+            pixelBuffer                                   = Devel::PixelBuffer(internal.Get());
           }
         }
       }
index 726ac927be0a603cde64ac4f221db93772067190..743946628917b9b52d2aa8ec0eb0a129a21911d6 100644 (file)
@@ -110,15 +110,17 @@ struct BidirectionalSupport::Plugin
     BidirectionalInfo* bidirectionalInfo = new BidirectionalInfo();
 
     bidirectionalInfo->characterTypes = reinterpret_cast<FriBidiCharType*>(malloc(numberOfCharacters * sizeof(FriBidiCharType)));
-    if(!bidirectionalInfo->characterTypes)
+    if(DALI_UNLIKELY(!bidirectionalInfo->characterTypes))
     {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", numberOfCharacters * sizeof(FriBidiCharType));
       delete bidirectionalInfo;
       return 0;
     }
 
     bidirectionalInfo->embeddedLevels = reinterpret_cast<FriBidiLevel*>(malloc(numberOfCharacters * sizeof(FriBidiLevel)));
-    if(!bidirectionalInfo->embeddedLevels)
+    if(DALI_UNLIKELY(!bidirectionalInfo->embeddedLevels))
     {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", numberOfCharacters * sizeof(FriBidiLevel));
       free(bidirectionalInfo->characterTypes);
       delete bidirectionalInfo;
       return 0;
@@ -133,7 +135,9 @@ struct BidirectionalSupport::Plugin
     bidirectionalInfo->bracketTypes = reinterpret_cast<FriBidiBracketType*>(malloc(numberOfCharacters * sizeof(FriBidiBracketType)));
     if(!bidirectionalInfo->bracketTypes)
     {
-      free(bidirectionalInfo->bracketTypes);
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", numberOfCharacters * sizeof(FriBidiBracketType));
+      free(bidirectionalInfo->embeddedLevels);
+      free(bidirectionalInfo->characterTypes);
       delete bidirectionalInfo;
       return 0;
     }
@@ -143,8 +147,9 @@ struct BidirectionalSupport::Plugin
     // Retrieve the embedding levels.
     if(fribidi_get_par_embedding_levels_ex(bidirectionalInfo->characterTypes, bidirectionalInfo->bracketTypes, numberOfCharacters, &bidirectionalInfo->paragraphDirection, bidirectionalInfo->embeddedLevels) == 0)
     {
-      free(bidirectionalInfo->characterTypes);
       free(bidirectionalInfo->bracketTypes);
+      free(bidirectionalInfo->embeddedLevels);
+      free(bidirectionalInfo->characterTypes);
       delete bidirectionalInfo;
       return 0;
     }
@@ -216,7 +221,7 @@ struct BidirectionalSupport::Plugin
     // Copy embedded levels as fribidi_reorder_line() may change them.
     const size_t  embeddedLevelsSize = static_cast<std::size_t>(numberOfCharacters) * sizeof(FriBidiLevel);
     FriBidiLevel* embeddedLevels     = reinterpret_cast<FriBidiLevel*>(malloc(embeddedLevelsSize));
-    if(embeddedLevels)
+    if(DALI_LIKELY(embeddedLevels))
     {
       memcpy(embeddedLevels, bidirectionalInfo->embeddedLevels + firstCharacterIndex, embeddedLevelsSize);
 
@@ -236,6 +241,10 @@ struct BidirectionalSupport::Plugin
       // Free resources.
       free(embeddedLevels);
     }
+    else
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", embeddedLevelsSize);
+    }
   }
 
   bool GetMirroredText(Character*          text,
index 03ef5dda1b3dd6fbb9981a1e7379fbff349752e1..ed70ccbc0fe1efba49b6802495304d2d5a3d4893 100644 (file)
@@ -908,6 +908,10 @@ Devel::PixelBuffer RenderTextCairo(const TextAbstraction::TextRenderer::Paramete
                 data.buffer          = newBuffer;
                 data.compressionType = TextAbstraction::GlyphBufferData::CompressionType::NO_COMPRESSION;
               }
+              else
+              {
+                DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", widthOut, heightOut, pixelSize);
+              }
             }
 
             Dali::Internal::Platform::RotateByShear(data.buffer,
index bc460ee5054d7eb737ffee7ff23d991774be2843..972b88e5b268e0d917e45345afb0eab84887b56f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -165,7 +165,7 @@ struct Hyphenation::Plugin
     }
 
     hyphens = (char*)malloc(wordLength + 5);
-    if(hyphens)
+    if(DALI_LIKELY(hyphens))
     {
       hnj_hyphen_hyphenate2(dict, (char*)(word), wordLength, hyphens, NULL, &rep, &pos, &cut);
 
@@ -178,6 +178,10 @@ struct Hyphenation::Plugin
 
       free(hyphens);
     }
+    else
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", wordLength + 5);
+    }
 #endif
 
     return hyphensList;
index a0c833520aee5736cf5c27123a62de751af4424c..fc1e5296af4572de1404085d8aee697f037d9a74 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,8 @@
 
 #include <dali/internal/text/text-abstraction/plugin/font-client-utils.h>
 
+#include <dali/integration-api/debug.h>
+
 namespace Dali::TextAbstraction::Internal
 {
 void EmbeddedItem::GetGlyphMetrics(GlyphInfo& glyph)
@@ -51,8 +53,14 @@ void EmbeddedItem::CreateBitmap(const std::vector<PixelBufferCacheItem>& pixelBu
     // Creates the output buffer
     const uint32_t bufferSize = data.width * data.height * 4u;
     data.buffer               = (uint8_t*)malloc(bufferSize); // @note The caller is responsible for deallocating the bitmap data using free.
-
-    memset(data.buffer, 0u, bufferSize);
+    if(DALI_UNLIKELY(!data.buffer))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", bufferSize);
+    }
+    else
+    {
+      memset(data.buffer, 0u, bufferSize);
+    }
 
     // Just creates a void buffer. Doesn't matter what pixel format is set as is the application code the responsible of filling it.
   }
index e7b8ec394029c0092ea904f093175309046e5d70..2c962a61041b9ddcb8a62656ec9dd65d28d88bab 100644 (file)
@@ -953,6 +953,12 @@ PixelData FontClient::Plugin::CreateBitmap(FontId fontId, GlyphIndex glyphIndex,
   if(!data.isBufferOwned || data.compressionType != TextAbstraction::GlyphBufferData::CompressionType::NO_COMPRESSION)
   {
     uint8_t* newBuffer = (uint8_t*)malloc(data.width * data.height * Pixel::GetBytesPerPixel(data.format));
+    if(DALI_UNLIKELY(!newBuffer))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x %u\n", data.width, data.height, Pixel::GetBytesPerPixel(data.format));
+      return Dali::PixelData();
+    }
+
     TextAbstraction::GlyphBufferData::Decompress(data, newBuffer);
     if(data.isBufferOwned)
     {
index 5bfedb196287288b6bcbd3cfa75c703f50f4847f..a6d56fa9a95fdab7c77c0137443634a6770a7119 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -193,6 +193,12 @@ void ConvertBitmap(TextAbstraction::GlyphBufferData& data, unsigned int srcWidth
   {
     data.isBufferOwned = true;
     data.buffer        = (uint8_t*)malloc(bufferSize); // @note The caller is responsible for deallocating the bitmap data using free.
+
+    if(DALI_UNLIKELY(!data.buffer))
+    {
+      DALI_LOG_ERROR("malloc is failed. request malloc size : %u\n", bufferSize);
+      return;
+    }
     Dali::Internal::Platform::LanczosSample(srcBuffer,
                                             inputDimensions,
                                             srcWidth,
index 96817dbfc5e3fc0b34e35c2d33ba3748d92564ea..0bed3f27b10f69286fb45fc00b54a449ce71ce98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -168,7 +168,18 @@ bool GlyphCacheManager::LoadGlyphDataFromIndex(
       {
         glyphData.mIsBitmap       = true;
         glyphData.mBitmap->buffer = (uint8_t*)malloc(bufferSize * sizeof(uint8_t)); // @note The caller is responsible for deallocating the bitmap data using free.
-        memcpy(glyphData.mBitmap->buffer, freeTypeFace->glyph->bitmap.buffer, bufferSize);
+        if(DALI_UNLIKELY(!glyphData.mBitmap->buffer))
+        {
+          DALI_LOG_ERROR("malloc is failed. request malloc size : %zu\n", bufferSize * sizeof(uint8_t));
+          delete glyphData.mBitmap;
+          glyphData.mIsBitmap = false;
+          glyphData.mBitmap   = nullptr;
+          error               = static_cast<FT_Error>(-1);
+        }
+        else
+        {
+          memcpy(glyphData.mBitmap->buffer, freeTypeFace->glyph->bitmap.buffer, bufferSize);
+        }
       }
       else
       {
@@ -225,12 +236,20 @@ void GlyphCacheManager::ResizeBitmapGlyph(
             if(glyphData.mBitmap->pitch == static_cast<int>(glyphData.mBitmap->width))
             {
               desiredBuffer = (uint8_t*)malloc(desiredWidth * desiredHeight * sizeof(uint8_t)); // @note The caller is responsible for deallocating the bitmap data using free.
-              // Resize bitmap here.
-              Dali::Internal::Platform::LanczosSample1BPP(glyphData.mBitmap->buffer,
-                                                          inputDimensions,
-                                                          glyphData.mBitmap->width,
-                                                          desiredBuffer,
-                                                          desiredDimensions);
+
+              if(DALI_UNLIKELY(!desiredBuffer))
+              {
+                DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x 1\n", desiredWidth, desiredHeight);
+              }
+              else
+              {
+                // Resize bitmap here.
+                Dali::Internal::Platform::LanczosSample1BPP(glyphData.mBitmap->buffer,
+                                                            inputDimensions,
+                                                            glyphData.mBitmap->width,
+                                                            desiredBuffer,
+                                                            desiredDimensions);
+              }
             }
             break;
           }
@@ -240,12 +259,20 @@ void GlyphCacheManager::ResizeBitmapGlyph(
             if(glyphData.mBitmap->pitch == static_cast<int>(glyphData.mBitmap->width << 2u))
             {
               desiredBuffer = (uint8_t*)malloc((desiredWidth * desiredHeight * sizeof(uint8_t)) << 2u); // @note The caller is responsible for deallocating the bitmap data using free.
-              // Resize bitmap here.
-              Dali::Internal::Platform::LanczosSample4BPP(glyphData.mBitmap->buffer,
-                                                          inputDimensions,
-                                                          glyphData.mBitmap->width,
-                                                          desiredBuffer,
-                                                          desiredDimensions);
+
+              if(DALI_UNLIKELY(!desiredBuffer))
+              {
+                DALI_LOG_ERROR("malloc is failed. request malloc size : %u x %u x 4\n", desiredWidth, desiredHeight);
+              }
+              else
+              {
+                // Resize bitmap here.
+                Dali::Internal::Platform::LanczosSample4BPP(glyphData.mBitmap->buffer,
+                                                            inputDimensions,
+                                                            glyphData.mBitmap->width,
+                                                            desiredBuffer,
+                                                            desiredDimensions);
+              }
             }
             break;
           }