Fix coverity issue (invalid iterator access) 04/301304/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 14 Nov 2023 01:46:51 +0000 (10:46 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 14 Nov 2023 01:49:51 +0000 (10:49 +0900)
We can setup ImageType freely. If some user set invalid image type into
EncodedImageBuffer, it will be crash.

To avoid this situation, let we allow to set invalid image type, and
it will works like regular image type.

Change-Id: I84757da0540755f12eb9a12850941ba6bd93bac1
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp
dali-toolkit/internal/texture-manager/texture-cache-manager.cpp

index 52d5495..2510393 100644 (file)
@@ -959,6 +959,46 @@ int UtcDaliImageViewEncodedBufferWithAnimatedVectorImage(void)
   END_TEST;
 }
 
+int UtcDaliImageViewEncodedBufferWithInvalidImageType(void)
+{
+  ToolkitTestApplication     application;
+  TestGlAbstraction&         gl          = application.GetGlAbstraction();
+  const std::vector<GLuint>& textures    = gl.GetBoundTextures();
+  size_t                     numTextures = textures.size();
+
+  // Get encoded raw-buffer jpg image with invalid image type, and generate url
+  EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_34_RGBA, static_cast<EncodedImageBuffer::ImageType>(-1));
+  ImageUrl           url    = Toolkit::Image::GenerateUrl(buffer);
+
+  // Async loading, no atlasing for big size image
+  ImageView imageView = ImageView::New(url.GetUrl());
+
+  // By default, Aysnc loading is used
+  application.GetScene().Add(imageView);
+  imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
+  imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+
+  application.SendNotification();
+  application.Render(16);
+
+  // Load image
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render(16);
+  application.SendNotification();
+
+  const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
+  DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
+
+  // Remove visual, for line coverage.
+  imageView.Unparent();
+  application.SendNotification();
+  application.Render(16);
+
+  END_TEST;
+}
+
 int UtcDaliImageViewAddedTexture(void)
 {
   ToolkitTestApplication application;
index 095f21f..2dfd16f 100644 (file)
@@ -36,18 +36,22 @@ namespace
 {
 const std::string_view& GetEncodedImageBufferExtensions(Dali::EncodedImageBuffer::ImageType imageType)
 {
+  static constexpr std::string_view                                                            emptyString = "";
   static const std::unordered_map<Dali::EncodedImageBuffer::ImageType, const std::string_view> gEncodedImageBufferExtensionMap =
     {
-      {Dali::EncodedImageBuffer::ImageType::REGULAR_IMAGE, ""},
+      {Dali::EncodedImageBuffer::ImageType::REGULAR_IMAGE, emptyString},
       {Dali::EncodedImageBuffer::ImageType::VECTOR_IMAGE, ".svg"},
       {Dali::EncodedImageBuffer::ImageType::ANIMATED_VECTOR_IMAGE, ".json"},
     };
 
   const auto iter = gEncodedImageBufferExtensionMap.find(imageType);
 
-  DALI_ASSERT_DEBUG(iter != gEncodedImageBufferExtensionMap.end());
+  if(DALI_LIKELY(iter != gEncodedImageBufferExtensionMap.end()))
+  {
+    return iter->second;
+  }
 
-  return iter->second;
+  return emptyString;
 }
 } // namespace
 #ifdef DEBUG_ENABLED