From 6b9b342bf3f335e68945cbcb3c38dc2c0e891242 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 12 May 2026 12:50:19 +0200 Subject: [PATCH] fix(renderer): guard ImageManager callback against use-after-free (#4233) --- src/mbgl/renderer/image_manager.cpp | 10 +- src/mbgl/renderer/image_manager.hpp | 7 +- src/mbgl/renderer/render_orchestrator.cpp | 2 +- test/include/mbgl/test/vector_tile_test.hpp | 2 +- test/renderer/image_manager.test.cpp | 201 ++++++++++---------- test/style/source.test.cpp | 2 +- test/tile/custom_geometry_tile.test.cpp | 2 +- test/tile/geojson_tile.test.cpp | 2 +- test/tile/raster_dem_tile.test.cpp | 2 +- test/tile/raster_tile.test.cpp | 2 +- 10 files changed, 116 insertions(+), 116 deletions(-) diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index 9327f7a08..864b70cf9 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -260,10 +260,12 @@ void ImageManager::checkMissingAndNotify(ImageRequestor& requestor, const ImageR requestor.addPendingRequest(missingImage); } - auto removePendingRequests = [this, missingImage] { - std::scoped_lock readWriteLock(rwLock); - auto existingRequest = requestedImages.find(missingImage); - if (existingRequest == requestedImages.end()) { + auto removePendingRequests = [weakSelf = weak_from_this(), missingImage] { + auto self = weakSelf.lock(); + if (!self) return; + std::scoped_lock readWriteLock(self->rwLock); + auto existingRequest = self->requestedImages.find(missingImage); + if (existingRequest == self->requestedImages.end()) { return; } diff --git a/src/mbgl/renderer/image_manager.hpp b/src/mbgl/renderer/image_manager.hpp index 465fcd8aa..236049f74 100644 --- a/src/mbgl/renderer/image_manager.hpp +++ b/src/mbgl/renderer/image_manager.hpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -24,9 +25,9 @@ class ImageRequestor; * @brief tracks requests for icon images from tile workers and sends responses * when the requests are fulfilled. */ -class ImageManager { +class ImageManager : public std::enable_shared_from_this { public: - ImageManager(); + static std::shared_ptr create() { return std::shared_ptr(new ImageManager()); } ImageManager(const ImageManager&) = delete; ImageManager& operator=(const ImageManager&) = delete; ~ImageManager(); @@ -57,6 +58,8 @@ public: void clear(); private: + ImageManager(); + void checkMissingAndNotify(ImageRequestor&, const ImageRequestPair&); void notify(ImageRequestor&, const ImageRequestPair&) const; diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 3e6f8089f..29ea0d746 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -117,7 +117,7 @@ RenderOrchestrator::RenderOrchestrator(bool backgroundLayerAsColor_, const std::optional& localFontFamily_) : observer(&nullObserver()), glyphManager(std::make_unique(std::make_unique(localFontFamily_))), - imageManager(std::make_unique()), + imageManager(ImageManager::create()), lineAtlas(std::make_unique()), patternAtlas(std::make_unique()), imageImpls(makeMutable>>()), diff --git a/test/include/mbgl/test/vector_tile_test.hpp b/test/include/mbgl/test/vector_tile_test.hpp index 9ae85853b..5cf618a5a 100644 --- a/test/include/mbgl/test/vector_tile_test.hpp +++ b/test/include/mbgl/test/vector_tile_test.hpp @@ -23,7 +23,7 @@ public: util::RunLoop loop; AnnotationManager annotationManager{style}; - const std::shared_ptr imageManager = std::make_shared(); + const std::shared_ptr imageManager = ImageManager::create(); const std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; TaggedScheduler threadPool; diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp index 282b49822..e873c7ccf 100644 --- a/test/renderer/image_manager.test.cpp +++ b/test/renderer/image_manager.test.cpp @@ -16,66 +16,66 @@ using namespace mbgl; TEST(ImageManager, Missing) { - ImageManager imageManager; - EXPECT_FALSE(imageManager.getImage("doesnotexist")); + auto imageManager = ImageManager::create(); + EXPECT_FALSE(imageManager->getImage("doesnotexist")); } TEST(ImageManager, Basic) { FixtureLog log; - ImageManager imageManager; + auto imageManager = ImageManager::create(); auto images = parseSprite("default", util::read_file("test/fixtures/annotations/emerald.png"), util::read_file("test/fixtures/annotations/emerald.json")); for (auto& image : images) { - imageManager.addImage(image); - auto* stored = imageManager.getImage(image->id); + imageManager->addImage(image); + auto* stored = imageManager->getImage(image->id); ASSERT_TRUE(stored); EXPECT_EQ(image->image.size, stored->image.size); } - imageManager.dumpDebugLogs(); + imageManager->dumpDebugLogs(); } TEST(ImageManager, AddRemove) { FixtureLog log; - ImageManager imageManager; + auto imageManager = ImageManager::create(); - imageManager.addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); - imageManager.addImage(makeMutable("two", PremultipliedImage({16, 16}), 2.0f)); - imageManager.addImage(makeMutable("three", PremultipliedImage({16, 16}), 2.0f)); + imageManager->addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); + imageManager->addImage(makeMutable("two", PremultipliedImage({16, 16}), 2.0f)); + imageManager->addImage(makeMutable("three", PremultipliedImage({16, 16}), 2.0f)); - imageManager.removeImage("one"); - imageManager.removeImage("two"); + imageManager->removeImage("one"); + imageManager->removeImage("two"); - EXPECT_NE(nullptr, imageManager.getImage("three")); - EXPECT_EQ(nullptr, imageManager.getImage("two")); - EXPECT_EQ(nullptr, imageManager.getImage("four")); + EXPECT_NE(nullptr, imageManager->getImage("three")); + EXPECT_EQ(nullptr, imageManager->getImage("two")); + EXPECT_EQ(nullptr, imageManager->getImage("four")); } TEST(ImageManager, Update) { FixtureLog log; - ImageManager imageManager; + auto imageManager = ImageManager::create(); - imageManager.addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); - EXPECT_EQ(0, imageManager.updatedImageVersions.size()); - imageManager.updateImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); - EXPECT_EQ(1, imageManager.updatedImageVersions.size()); - imageManager.removeImage("one"); - EXPECT_EQ(0, imageManager.updatedImageVersions.size()); + imageManager->addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); + EXPECT_EQ(0, imageManager->updatedImageVersions.size()); + imageManager->updateImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); + EXPECT_EQ(1, imageManager->updatedImageVersions.size()); + imageManager->removeImage("one"); + EXPECT_EQ(0, imageManager->updatedImageVersions.size()); } TEST(ImageManager, RemoveReleasesBinPackRect) { FixtureLog log; - ImageManager imageManager; + auto imageManager = ImageManager::create(); - imageManager.addImage(makeMutable("big", PremultipliedImage({32, 32}), 1.0f)); - EXPECT_TRUE(imageManager.getImage("big")); + imageManager->addImage(makeMutable("big", PremultipliedImage({32, 32}), 1.0f)); + EXPECT_TRUE(imageManager->getImage("big")); - imageManager.removeImage("big"); + imageManager->removeImage("big"); - imageManager.addImage(makeMutable("big", PremultipliedImage({32, 32}), 1.0f)); - EXPECT_TRUE(imageManager.getImage("big")); + imageManager->addImage(makeMutable("big", PremultipliedImage({32, 32}), 1.0f)); + EXPECT_TRUE(imageManager->getImage("big")); EXPECT_TRUE(log.empty()); } @@ -97,13 +97,12 @@ public: TEST(ImageManager, NotifiesRequestorWhenSpriteIsLoaded) { util::RunLoop runLoop; - auto imageManagerPtr = std::make_shared(); - auto& imageManager = *imageManagerPtr; - StubImageRequestor requestor(imageManagerPtr); + auto imageManager = ImageManager::create(); + StubImageRequestor requestor(imageManager); bool notified = false; ImageManagerObserver observer; - imageManager.setObserver(&observer); + imageManager->setObserver(&observer); requestor.imagesAvailable = [&](ImageMap, ImageMap, ImageVersionMap) { notified = true; @@ -112,23 +111,22 @@ TEST(ImageManager, NotifiesRequestorWhenSpriteIsLoaded) { uint64_t imageCorrelationID = 0; ImageDependencies dependencies; dependencies.emplace("one", ImageType::Icon); - imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + imageManager->getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); runLoop.runOnce(); ASSERT_FALSE(notified); - imageManager.setLoaded(true); + imageManager->setLoaded(true); runLoop.runOnce(); ASSERT_FALSE(notified); - imageManager.notifyIfMissingImageAdded(); + imageManager->notifyIfMissingImageAdded(); runLoop.runOnce(); ASSERT_TRUE(notified); } TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) { - auto imageManagerPtr = std::make_shared(); - auto& imageManager = *imageManagerPtr; - StubImageRequestor requestor(imageManagerPtr); + auto imageManager = ImageManager::create(); + StubImageRequestor requestor(imageManager); bool notified = false; requestor.imagesAvailable = [&](ImageMap, ImageMap, ImageVersionMap) { @@ -138,8 +136,8 @@ TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) { uint64_t imageCorrelationID = 0; ImageDependencies dependencies; dependencies.emplace("one", ImageType::Icon); - imageManager.addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); - imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + imageManager->addImage(makeMutable("one", PremultipliedImage({16, 16}), 2.0f)); + imageManager->getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); ASSERT_TRUE(notified); } @@ -164,12 +162,11 @@ public: TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) { util::RunLoop runLoop; - auto imageManagerPtr = std::make_shared(); - auto& imageManager = *imageManagerPtr; - StubImageRequestor requestor(imageManagerPtr); + auto imageManager = ImageManager::create(); + StubImageRequestor requestor(imageManager); StubImageManagerObserver observer; - imageManager.setObserver(&observer); + imageManager->setObserver(&observer); bool notified = false; @@ -180,19 +177,19 @@ TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) { uint64_t imageCorrelationID = 0; ImageDependencies dependencies; dependencies.emplace("pre", ImageType::Icon); - imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + imageManager->getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); runLoop.runOnce(); EXPECT_EQ(observer.count, 0); ASSERT_FALSE(notified); - imageManager.setLoaded(true); + imageManager->setLoaded(true); runLoop.runOnce(); EXPECT_EQ(observer.count, 1); ASSERT_FALSE(notified); - imageManager.notifyIfMissingImageAdded(); + imageManager->notifyIfMissingImageAdded(); runLoop.runOnce(); EXPECT_EQ(observer.count, 1); @@ -201,31 +198,30 @@ TEST(ImageManager, OnStyleImageMissingBeforeSpriteLoaded) { // Request for updated dependencies must be dispatched to the // observer. dependencies.emplace("post", ImageType::Icon); - imageManager.getImages(requestor, std::make_pair(dependencies, ++imageCorrelationID)); + imageManager->getImages(requestor, std::make_pair(dependencies, ++imageCorrelationID)); ASSERT_TRUE(requestor.hasPendingRequests()); runLoop.runOnce(); ASSERT_FALSE(requestor.hasPendingRequests()); // Another requestor shall not have pending requests for already obtained images. - StubImageRequestor anotherRequestor(imageManagerPtr); - imageManager.getImages(anotherRequestor, std::make_pair(dependencies, ++imageCorrelationID)); + StubImageRequestor anotherRequestor(imageManager); + imageManager->getImages(anotherRequestor, std::make_pair(dependencies, ++imageCorrelationID)); ASSERT_FALSE(anotherRequestor.hasPendingRequests()); dependencies.emplace("unfamiliar", ImageType::Icon); - imageManager.getImages(anotherRequestor, std::make_pair(dependencies, ++imageCorrelationID)); + imageManager->getImages(anotherRequestor, std::make_pair(dependencies, ++imageCorrelationID)); EXPECT_TRUE(anotherRequestor.hasPendingRequests()); EXPECT_TRUE(anotherRequestor.hasPendingRequest("unfamiliar")); } TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) { util::RunLoop runLoop; - auto imageManagerPtr = std::make_shared(); - auto& imageManager = *imageManagerPtr; - StubImageRequestor requestor(imageManagerPtr); + auto imageManager = ImageManager::create(); + StubImageRequestor requestor(imageManager); StubImageManagerObserver observer; - imageManager.setObserver(&observer); + imageManager->setObserver(&observer); bool notified = false; @@ -236,19 +232,19 @@ TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) { EXPECT_EQ(observer.count, 0); ASSERT_FALSE(notified); - imageManager.setLoaded(true); + imageManager->setLoaded(true); runLoop.runOnce(); uint64_t imageCorrelationID = 0; ImageDependencies dependencies; dependencies.emplace("after", ImageType::Icon); - imageManager.getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); + imageManager->getImages(requestor, std::make_pair(dependencies, imageCorrelationID)); runLoop.runOnce(); EXPECT_EQ(observer.count, 1); ASSERT_FALSE(notified); - imageManager.notifyIfMissingImageAdded(); + imageManager->notifyIfMissingImageAdded(); runLoop.runOnce(); EXPECT_EQ(observer.count, 1); @@ -257,110 +253,109 @@ TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) { TEST(ImageManager, RemoveUnusedStyleImages) { util::RunLoop runLoop; - auto imageManagerPtr = std::make_shared(); - auto& imageManager = *imageManagerPtr; + auto imageManager = ImageManager::create(); StubImageManagerObserver observer; - imageManager.setObserver(&observer); - imageManager.setLoaded(true); + imageManager->setObserver(&observer); + imageManager->setLoaded(true); observer.imageMissing = [&imageManager](const std::string& id) { if (id == "1024px") { - imageManager.addImage(makeMutable(id, PremultipliedImage({1024, 1024}), 1.0f)); + imageManager->addImage(makeMutable(id, PremultipliedImage({1024, 1024}), 1.0f)); } else { - imageManager.addImage(makeMutable(id, PremultipliedImage({16, 16}), 1.0f)); + imageManager->addImage(makeMutable(id, PremultipliedImage({16, 16}), 1.0f)); } }; observer.removeUnusedStyleImages = [&imageManager](const std::vector& ids) { for (const auto& id : ids) { - assert(imageManager.getImage(id)); - imageManager.removeImage(id); + assert(imageManager->getImage(id)); + imageManager->removeImage(id); } }; // Style sprite. - imageManager.addImage(makeMutable("sprite", PremultipliedImage({16, 16}), 1.0f)); + imageManager->addImage(makeMutable("sprite", PremultipliedImage({16, 16}), 1.0f)); // Single requestor { - std::unique_ptr requestor = std::make_unique(imageManagerPtr); - imageManager.getImages(*requestor, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); + std::unique_ptr requestor = std::make_unique(imageManager); + imageManager->getImages(*requestor, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); runLoop.runOnce(); EXPECT_EQ(observer.count, 1); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); } // Within cache limits, no need to notify client. - imageManager.reduceMemoryUseIfCacheSizeExceedsLimit(); + imageManager->reduceMemoryUseIfCacheSizeExceedsLimit(); runLoop.runOnce(); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); // Simulate OOM case, forces client notification to be issued. - imageManager.reduceMemoryUse(); + imageManager->reduceMemoryUse(); runLoop.runOnce(); - ASSERT_TRUE(imageManager.getImage("missing") == nullptr); - ASSERT_FALSE(imageManager.getImage("sprite") == nullptr); + ASSERT_TRUE(imageManager->getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("sprite") == nullptr); // Single requestor, exceed cache size limit. { - std::unique_ptr requestor = std::make_unique(imageManagerPtr); - imageManager.getImages(*requestor, std::make_pair(ImageDependencies{{"1024px", ImageType::Icon}}, 0ull)); + std::unique_ptr requestor = std::make_unique(imageManager); + imageManager->getImages(*requestor, std::make_pair(ImageDependencies{{"1024px", ImageType::Icon}}, 0ull)); runLoop.runOnce(); EXPECT_EQ(observer.count, 2); - ASSERT_FALSE(imageManager.getImage("1024px") == nullptr); + ASSERT_FALSE(imageManager->getImage("1024px") == nullptr); } // Over cache limits, need to notify client. - imageManager.reduceMemoryUseIfCacheSizeExceedsLimit(); + imageManager->reduceMemoryUseIfCacheSizeExceedsLimit(); runLoop.runOnce(); - ASSERT_TRUE(imageManager.getImage("1024px") == nullptr); - ASSERT_FALSE(imageManager.getImage("sprite") == nullptr); + ASSERT_TRUE(imageManager->getImage("1024px") == nullptr); + ASSERT_FALSE(imageManager->getImage("sprite") == nullptr); // Multiple requestors { - std::unique_ptr requestor1 = std::make_unique(imageManagerPtr); - std::unique_ptr requestor2 = std::make_unique(imageManagerPtr); - imageManager.getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); - imageManager.getImages(*requestor2, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); + std::unique_ptr requestor1 = std::make_unique(imageManager); + std::unique_ptr requestor2 = std::make_unique(imageManager); + imageManager->getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); + imageManager->getImages(*requestor2, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); runLoop.runOnce(); EXPECT_EQ(observer.count, 3); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); } // Reduce memory usage and check that unused image was deleted when all requestors are destructed. - imageManager.reduceMemoryUseIfCacheSizeExceedsLimit(); + imageManager->reduceMemoryUseIfCacheSizeExceedsLimit(); runLoop.runOnce(); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); - imageManager.reduceMemoryUse(); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); + imageManager->reduceMemoryUse(); runLoop.runOnce(); - ASSERT_TRUE(imageManager.getImage("missing") == nullptr); + ASSERT_TRUE(imageManager->getImage("missing") == nullptr); // Multiple requestors, check that image resource is not destroyed if there // is at least 1 requestor that uses it. - std::unique_ptr requestor = std::make_unique(imageManagerPtr); + std::unique_ptr requestor = std::make_unique(imageManager); { - std::unique_ptr requestor1 = std::make_unique(imageManagerPtr); - imageManager.getImages( + std::unique_ptr requestor1 = std::make_unique(imageManager); + imageManager->getImages( *requestor, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}, {"1024px", ImageType::Icon}}, 0ull)); - imageManager.getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); + imageManager->getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); runLoop.runOnce(); EXPECT_EQ(observer.count, 5); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); - ASSERT_FALSE(imageManager.getImage("1024px") == nullptr); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("1024px") == nullptr); } // Reduce memory usage and check that requested image is not destructed. - imageManager.reduceMemoryUseIfCacheSizeExceedsLimit(); + imageManager->reduceMemoryUseIfCacheSizeExceedsLimit(); runLoop.runOnce(); - ASSERT_FALSE(imageManager.getImage("missing") == nullptr); - ASSERT_FALSE(imageManager.getImage("1024px") == nullptr); + ASSERT_FALSE(imageManager->getImage("missing") == nullptr); + ASSERT_FALSE(imageManager->getImage("1024px") == nullptr); // Release last requestor and check if resource was released when cache size is over the limit. requestor.reset(); - imageManager.reduceMemoryUseIfCacheSizeExceedsLimit(); + imageManager->reduceMemoryUseIfCacheSizeExceedsLimit(); runLoop.runOnce(); - ASSERT_TRUE(imageManager.getImage("missing") == nullptr); - ASSERT_TRUE(imageManager.getImage("1024px") == nullptr); - ASSERT_FALSE(imageManager.getImage("sprite") == nullptr); + ASSERT_TRUE(imageManager->getImage("missing") == nullptr); + ASSERT_TRUE(imageManager->getImage("1024px") == nullptr); + ASSERT_FALSE(imageManager->getImage("sprite") == nullptr); } diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp index fd02e7aa5..181340d35 100644 --- a/test/style/source.test.cpp +++ b/test/style/source.test.cpp @@ -63,7 +63,7 @@ public: Transform transform; TransformState transformState; AnnotationManager annotationManager{style}; - std::shared_ptr imageManager = std::make_shared(); + std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; TaggedScheduler threadPool; diff --git a/test/tile/custom_geometry_tile.test.cpp b/test/tile/custom_geometry_tile.test.cpp index fed5a36ba..e782d2bb7 100644 --- a/test/tile/custom_geometry_tile.test.cpp +++ b/test/tile/custom_geometry_tile.test.cpp @@ -28,7 +28,7 @@ public: TransformState transformState; util::RunLoop loop; AnnotationManager annotationManager{style}; - std::shared_ptr imageManager = std::make_shared(); + std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; diff --git a/test/tile/geojson_tile.test.cpp b/test/tile/geojson_tile.test.cpp index 7ff13e748..3fc2e5f0d 100644 --- a/test/tile/geojson_tile.test.cpp +++ b/test/tile/geojson_tile.test.cpp @@ -28,7 +28,7 @@ public: TransformState transformState; util::RunLoop loop; AnnotationManager annotationManager{style}; - std::shared_ptr imageManager = std::make_shared(); + std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; diff --git a/test/tile/raster_dem_tile.test.cpp b/test/tile/raster_dem_tile.test.cpp index 60b4d12cd..5f842a686 100644 --- a/test/tile/raster_dem_tile.test.cpp +++ b/test/tile/raster_dem_tile.test.cpp @@ -22,7 +22,7 @@ public: TransformState transformState; util::RunLoop loop; AnnotationManager annotationManager{style}; - std::shared_ptr imageManager = std::make_shared(); + std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; diff --git a/test/tile/raster_tile.test.cpp b/test/tile/raster_tile.test.cpp index f716fb645..46af27e0f 100644 --- a/test/tile/raster_tile.test.cpp +++ b/test/tile/raster_tile.test.cpp @@ -22,7 +22,7 @@ public: TransformState transformState; util::RunLoop loop; AnnotationManager annotationManager{style}; - std::shared_ptr imageManager = std::make_shared(); + std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas;