rlottie: Fix Crash when the resource is not a valid lottie resource
authorsub.mohanty@samsung.com <smohantty@gmail.com>
Sun, 7 Jul 2019 04:36:59 +0000 (13:36 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 10 Jul 2019 01:59:20 +0000 (10:59 +0900)
- when resource dosen't have valid header
- layer dosen't have a transform object

src/lottie/lottieloader.cpp
src/lottie/lottieparser.cpp

index b39284e309fad133c61119968ad16f57ea2e3bee..158486aaceb824a3d41bedd03c85838dabd6e356 100644 (file)
@@ -96,6 +96,9 @@ bool LottieLoader::load(const std::string &path)
         LottieParser parser(const_cast<char *>(buf.str().data()),
                             dirname(path).c_str());
         mModel = parser.model();
+
+        if (!mModel) return false;
+
         LottieFileCache::instance().add(path, mModel);
 
         f.close();
@@ -113,6 +116,9 @@ bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key,
     LottieParser parser(const_cast<char *>(jsonData.c_str()),
                         resourcePath.c_str());
     mModel = parser.model();
+
+    if (!mModel) return false;
+
     LottieFileCache::instance().add(key, mModel);
 
     return true;
index 5f88aebdf772985c911bbb8d326a63a62564da65..08dbf602584067081b0ef756adb4ef08b0965e8c 100644 (file)
@@ -585,6 +585,12 @@ void LottieParserImpl::parseComposition()
             Skip(key);
         }
     }
+
+    if (comp->mVersion.empty()) {
+        // don't have a valid bodymovin header
+        return;
+    }
+
     resolveLayerRefs();
     comp->setStatic(comp->mRootLayer->isStatic());
     comp->mRootLayer->mInFrame = comp->mStartFrame;
@@ -709,8 +715,10 @@ std::shared_ptr<LOTAsset> LottieParserImpl::parseAsset()
             bool staticFlag = true;
             while (NextArrayValue()) {
                 std::shared_ptr<LOTData> layer = parseLayer();
-                staticFlag = staticFlag && layer->isStatic();
-                asset->mLayers.push_back(layer);
+                if (layer) {
+                    staticFlag = staticFlag && layer->isStatic();
+                    asset->mLayers.push_back(layer);
+                }
             }
             asset->setStatic(staticFlag);
         } else {
@@ -745,8 +753,10 @@ void LottieParserImpl::parseLayers(LOTCompositionData *comp)
     EnterArray();
     while (NextArrayValue()) {
         std::shared_ptr<LOTData> layer = parseLayer(true);
-        staticFlag = staticFlag && layer->isStatic();
-        comp->mRootLayer->mChildren.push_back(layer);
+        if (layer) {
+            staticFlag = staticFlag && layer->isStatic();
+            comp->mRootLayer->mChildren.push_back(layer);
+        }
     }
     comp->mRootLayer->setStatic(staticFlag);
 }
@@ -915,6 +925,11 @@ std::shared_ptr<LOTData> LottieParserImpl::parseLayer(bool record)
         }
     }
 
+    if (!layer->mTransform) {
+        // not a valid layer
+        return nullptr;
+    }
+
     layer->mCompRef = compRef;
 
     if (layer->hidden()) {
@@ -2240,6 +2255,8 @@ LottieParser::LottieParser(char *str, const char *dir_path)
 
 std::shared_ptr<LOTModel> LottieParser::model()
 {
+    if (!d->composition()) return nullptr;
+
     std::shared_ptr<LOTModel> model = std::make_shared<LOTModel>();
     model->mRoot = d->composition();
     model->mRoot->processRepeaterObjects();