From 8c2393f5c5076f986f7509aed58d606ef5036c01 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 9 Jul 2016 14:52:56 +0100 Subject: [PATCH] don't export invalid objects --- src/object/ObjectFactory.cpp | 24 ++++++++++++++++++++++++ src/object/ObjectFactory.h | 1 + src/object/ObjectManager.cpp | 4 ++-- src/object/ObjectRepository.cpp | 32 ++++++++++++++++++++------------ 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/object/ObjectFactory.cpp b/src/object/ObjectFactory.cpp index 0fa7a36fdd..8446f76f5a 100644 --- a/src/object/ObjectFactory.cpp +++ b/src/object/ObjectFactory.cpp @@ -167,6 +167,30 @@ namespace ObjectFactory return result; } + Object * CreateObjectFromLegacyData(const rct_object_entry * entry, const void * data, size_t dataSize) + { + Guard::ArgumentNotNull(entry); + Guard::ArgumentNotNull(data); + + Object * result = CreateObject(*entry); + if (result != nullptr) + { + utf8 objectName[9] = { 0 }; + Memory::Copy(objectName, entry->name, 8); + + auto readContext = ReadObjectContext(objectName); + auto chunkStream = MemoryStream(data, dataSize); + ReadObjectLegacy(result, &readContext, &chunkStream); + + if (readContext.WasError()) + { + delete result; + result = nullptr; + } + } + return result; + } + Object * CreateObject(const rct_object_entry &entry) { Object * result = nullptr; diff --git a/src/object/ObjectFactory.h b/src/object/ObjectFactory.h index 1f1ac4647e..455fa256b9 100644 --- a/src/object/ObjectFactory.h +++ b/src/object/ObjectFactory.h @@ -23,5 +23,6 @@ class Object; namespace ObjectFactory { Object * CreateObjectFromLegacyFile(const utf8 * path); + Object * CreateObjectFromLegacyData(const rct_object_entry * entry, const void * data, size_t dataSize); Object * CreateObject(const rct_object_entry &entry); } diff --git a/src/object/ObjectManager.cpp b/src/object/ObjectManager.cpp index f2fa25a423..eb3f0e4941 100644 --- a/src/object/ObjectManager.cpp +++ b/src/object/ObjectManager.cpp @@ -438,7 +438,7 @@ private: { utf8 objName[9] = { 0 }; Memory::Copy(objName, entry->name, 8); - Console::Error::WriteFormat("[%s]: Object not found.", objName); + Console::Error::WriteFormat("[%s] Object not found.", objName); Console::Error::WriteLine(); } @@ -446,7 +446,7 @@ private: { utf8 objName[9] = { 0 }; Memory::Copy(objName, entry->name, 8); - Console::Error::WriteFormat("[%s]: Object could not be loaded.", objName); + Console::Error::WriteFormat("[%s] Object could not be loaded.", objName); Console::Error::WriteLine(); } diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index 47405bc71d..07e3fdbf0e 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -207,20 +207,28 @@ public: // TODO append checksum match bytes - // TODO check object is loadable before writing it - - utf8 path[MAX_PATH]; - GetPathForNewObject(path, sizeof(path), objectName); - - Console::WriteLine("Adding object: [%s]", objectName); - try + // Check that the object is loadable before writing it + Object * object = ObjectFactory::CreateObjectFromLegacyData(objectEntry, data, dataSize); + if (object == nullptr) { - SaveObject(path, objectEntry, data, dataSize); - ScanObject(path); + Console::Error::WriteFormat("[%s] Unable to export object.", objectName); + Console::Error::WriteLine(); } - catch (Exception ex) + else { - Console::WriteLine("Failed saving object: [%s] to '%s'.", objectName, path); + utf8 path[MAX_PATH]; + GetPathForNewObject(path, sizeof(path), objectName); + + Console::WriteLine("Adding object: [%s]", objectName); + try + { + SaveObject(path, objectEntry, data, dataSize); + ScanObject(path); + } + catch (Exception ex) + { + Console::WriteLine("Failed saving object: [%s] to '%s'.", objectName, path); + } } } @@ -895,6 +903,6 @@ static void ReportMissingObject(const rct_object_entry * entry) { utf8 objName[9] = { 0 }; Memory::Copy(objName, entry->name, 8); - Console::Error::WriteFormat("[%s]: Object not found.", objName); + Console::Error::WriteFormat("[%s] Object not found.", objName); Console::Error::WriteLine(); }