Fix potential out-of-bounds access during glyph-character calculations. 82/317982/1 accepted/tizen/9.0/unified/20250117.022459
authorANZ1217 <chihun.jeong@samsung.com>
Thu, 9 Jan 2025 08:22:34 +0000 (17:22 +0900)
committerANZ1217 <chihun.jeong@samsung.com>
Fri, 10 Jan 2025 08:34:28 +0000 (17:34 +0900)
Add log for CreateCharacterToGlyphTable() and CreateGlyphsPerCharacterTable()

Change-Id: Ic3b859a491056188693ef64edab8a74d094b720d

dali-toolkit/internal/text/visual-model-impl.cpp

index 2f3ea3efe36446530c367ecfe31ddac10ade5cec..a290321b6727d8fca1a848296f8085bdafe6dc29 100644 (file)
@@ -17,6 +17,7 @@
 
 // CLASS HEADER
 #include <dali-toolkit/internal/text/visual-model-impl.h>
+#include <dali/integration-api/debug.h>
 
 // EXTERNAL INCLUDES
 #include <memory.h>
@@ -61,7 +62,14 @@ void VisualModel::CreateCharacterToGlyphTable(CharacterIndex startIndex,
   }
   else
   {
-    mCharactersToGlyph.Resize(numberOfCharacters);
+    if(startIndex != 0)
+    {
+      DALI_LOG_DEBUG_INFO("BEFORE: mGlyph2Char Size: %zu, mCharPerGlyph Size: %zu\n", mGlyphsToCharacters.Count(), mCharactersPerGlyph.Count());
+      DALI_LOG_DEBUG_INFO("mGlyphsPerCharacter Size: %zu, mCharactersToGlyph Size: %zu, startIndex: %u\n", mGlyphsPerCharacter.Size(), mCharactersToGlyph.Count(), startIndex);
+      DALI_LOG_DEBUG_INFO("startIndex is not zero when updateCurrentBuffer is false.\n");
+    }
+
+    mCharactersToGlyph.Resize(startIndex + numberOfCharacters);
     charactersToGlyphBuffer = mCharactersToGlyph.Begin() + startIndex;
   }
 
@@ -108,6 +116,13 @@ void VisualModel::CreateCharacterToGlyphTable(CharacterIndex startIndex,
                               newCharactersToGlyph.Begin(),
                               newCharactersToGlyph.End());
   }
+
+  if(mGlyphsPerCharacter.Size() != mCharactersToGlyph.Size())
+  {
+    DALI_LOG_ERROR("BEFORE: mGlyph2Char Size: %zu, mCharPerGlyph Size: %zu\n", mGlyphsToCharacters.Count(), mCharactersPerGlyph.Count());
+    DALI_LOG_ERROR("mGlyphsPerCharacter Size: %zu, mCharactersToGlyph Size: %zu, startIndex: %u\n", mGlyphsPerCharacter.Size(), mCharactersToGlyph.Count(), startIndex);
+    DALI_ASSERT_ALWAYS(false && "Size of mGlyphsPerCharacter is not equal to size of mCharactersToGlyph");
+  }
 }
 
 void VisualModel::CreateGlyphsPerCharacterTable(CharacterIndex startIndex,
@@ -137,7 +152,14 @@ void VisualModel::CreateGlyphsPerCharacterTable(CharacterIndex startIndex,
   }
   else
   {
-    mGlyphsPerCharacter.Resize(numberOfCharacters);
+    if(startIndex != 0)
+    {
+      DALI_LOG_DEBUG_INFO("BEFORE: mGlyph2Char Size: %zu, mCharPerGlyph Size: %zu\n", mGlyphsToCharacters.Count(), mCharactersPerGlyph.Count());
+      DALI_LOG_DEBUG_INFO("mGlyphsPerCharacter Size: %zu, mCharactersToGlyph Size: %zu, startIndex: %u\n", mGlyphsPerCharacter.Size(), mCharactersToGlyph.Count(), startIndex);
+      DALI_LOG_DEBUG_INFO("startIndex is not zero when updateCurrentBuffer is false.\n");
+    }
+
+    mGlyphsPerCharacter.Resize(startIndex + numberOfCharacters);
     glyphsPerCharacterBuffer = mGlyphsPerCharacter.Begin() + startIndex;
   }