Commit 77c5a5aa for libheif

commit 77c5a5aadec4f8c8d5408b632741842ba82616d8
Author: Joachim Bauch <bauch@struktur.de>
Date:   Mon Nov 3 16:14:01 2025 +0100

    Protect concurrent access to warnings.

diff --git a/libheif/image-items/grid.cc b/libheif/image-items/grid.cc
index ed96eefc..f1f19aed 100644
--- a/libheif/image-items/grid.cc
+++ b/libheif/image-items/grid.cc
@@ -382,7 +382,7 @@ Result<std::shared_ptr<HeifPixelImage>> ImageItem_Grid::decode_full_grid_image(c
           }
         }

-        err = decode_and_paste_tile_image(tileID, x0, y0, img, options, progress_counter);
+        err = decode_and_paste_tile_image(tileID, x0, y0, img, options, progress_counter, warnings);
         if (err) {
           return err;
         }
@@ -430,7 +430,7 @@ Result<std::shared_ptr<HeifPixelImage>> ImageItem_Grid::decode_full_grid_image(c
       errs.push_back(std::async(std::launch::async,
                                 &ImageItem_Grid::decode_and_paste_tile_image, this,
                                 data.tileID, data.x_origin, data.y_origin, std::ref(img), options,
-                                std::ref(progress_counter)));
+                                std::ref(progress_counter), std::ref(warnings)));
     }

     // check for decoding errors in remaining tiles
@@ -476,19 +476,23 @@ static Error progress_and_return_ok(const heif_decoding_options& options, int& p
 Error ImageItem_Grid::decode_and_paste_tile_image(heif_item_id tileID, uint32_t x0, uint32_t y0,
                                                   std::shared_ptr<HeifPixelImage>& inout_image,
                                                   const heif_decoding_options& options,
-                                                  int& progress_counter) const
+                                                  int& progress_counter, std::vector<Error>& warnings) const
 {
   std::shared_ptr<HeifPixelImage> tile_img;
+#if ENABLE_PARALLEL_TILE_DECODING
+  static std::mutex warningsMutex;
+#endif

   auto tileItem = get_context()->get_image(tileID, true);
   if (!tileItem && !options.strict_decoding) {
     // We ignore missing images.
-    if (inout_image) {
-      inout_image->add_warning(Error{
-        heif_error_Invalid_input,
-        heif_suberror_Missing_grid_images,
-      });
-    }
+#if ENABLE_PARALLEL_TILE_DECODING
+    std::lock_guard<std::mutex> lock(warningsMutex);
+#endif
+    warnings.push_back(Error{
+      heif_error_Invalid_input,
+      heif_suberror_Missing_grid_images,
+    });
     return progress_and_return_ok(options, progress_counter);
   }

@@ -501,12 +505,13 @@ Error ImageItem_Grid::decode_and_paste_tile_image(heif_item_id tileID, uint32_t
   if (!decodeResult) {
     if (!options.strict_decoding) {
       // We ignore broken tiles.
-      if (inout_image) {
-        inout_image->add_warning(Error{
-          heif_error_Invalid_input,
-          heif_suberror_Missing_grid_images,
-        });
-      }
+#if ENABLE_PARALLEL_TILE_DECODING
+      std::lock_guard<std::mutex> lock(warningsMutex);
+#endif
+      warnings.push_back(Error{
+        heif_error_Invalid_input,
+        heif_suberror_Missing_grid_images,
+      });
       return progress_and_return_ok(options, progress_counter);
     }

diff --git a/libheif/image-items/grid.h b/libheif/image-items/grid.h
index b886ef8a..0829cff0 100644
--- a/libheif/image-items/grid.h
+++ b/libheif/image-items/grid.h
@@ -167,7 +167,8 @@ private:

   Error decode_and_paste_tile_image(heif_item_id tileID, uint32_t x0, uint32_t y0,
                                     std::shared_ptr<HeifPixelImage>& inout_image,
-                                    const heif_decoding_options& options, int& progress_counter) const;
+                                    const heif_decoding_options& options, int& progress_counter,
+                                    std::vector<Error>& warnings) const;
 };