From 87cd9e47959d17fb9fafa8acbaf71bc8fb3d86bc Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 27 Jun 2024 01:01:07 +0900 Subject: [PATCH] lottie: fix a data-race problem make it sync call before accessing the composition data from marker and segments. issue: https://github.com/thorvg/thorvg/issues/2462 --- src/loaders/lottie/tvgLottieLoader.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/loaders/lottie/tvgLottieLoader.cpp b/src/loaders/lottie/tvgLottieLoader.cpp index c8ce44f2..04802937 100644 --- a/src/loaders/lottie/tvgLottieLoader.cpp +++ b/src/loaders/lottie/tvgLottieLoader.cpp @@ -273,7 +273,7 @@ Paint* LottieLoader::paint() bool LottieLoader::override(const char* slot) { - if (!comp) done(); + done(); if (!comp || comp->slots.count == 0) return false; @@ -365,7 +365,7 @@ float LottieLoader::duration() void LottieLoader::sync() { - this->done(); + done(); if (rebuild) run(0); } @@ -373,15 +373,15 @@ void LottieLoader::sync() uint32_t LottieLoader::markersCnt() { - if (!comp) done(); - if (!comp) return 0; - return comp->markers.count; + done(); + return comp ? comp->markers.count : 0; } const char* LottieLoader::markers(uint32_t index) { - if (!comp) done(); + done(); + if (!comp || index >= comp->markers.count) return nullptr; auto marker = comp->markers.begin() + index; return (*marker)->name; @@ -390,9 +390,10 @@ const char* LottieLoader::markers(uint32_t index) bool LottieLoader::segment(const char* marker, float& begin, float& end) { - if (!comp) done(); + done(); + if (!comp) return false; - + for (auto m = comp->markers.begin(); m < comp->markers.end(); ++m) { if (!strcmp(marker, (*m)->name)) { begin = (*m)->time / frameCnt;