diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2015-03-18 16:06:00 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-03-26 16:13:39 +0300 |
commit | 0e70ddfe14dfab28657087c779c1a37e3db295d8 (patch) | |
tree | c7350c29dcbf62a84e299bb4b3039b08164f3901 /source | |
parent | f5b360b4daf580468c5ae7c1fa9ccff25f6bdf7a (diff) |
Safeguard against crashes from invalid Alembic file paths by returning
NULL archive pointers.
This allows writer/reader code to test against obvious archive errors
easily and is unmistakable.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/cache_library.c | 2 | ||||
-rw-r--r-- | source/blender/editors/io/io_cache_library.c | 5 | ||||
-rw-r--r-- | source/blender/pointcache/PTC_api.cpp | 4 | ||||
-rw-r--r-- | source/blender/pointcache/alembic/abc_reader.cpp | 21 | ||||
-rw-r--r-- | source/blender/pointcache/alembic/abc_reader.h | 6 | ||||
-rw-r--r-- | source/blender/pointcache/alembic/abc_writer.cpp | 23 | ||||
-rw-r--r-- | source/blender/pointcache/alembic/abc_writer.h | 6 | ||||
-rw-r--r-- | source/blender/pointcache/alembic/alembic.cpp | 8 | ||||
-rw-r--r-- | source/blender/pointcache/intern/ptc_types.h | 4 |
9 files changed, 57 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c index fdb253a82d5..20d2b775bbb 100644 --- a/source/blender/blenkernel/intern/cache_library.c +++ b/source/blender/blenkernel/intern/cache_library.c @@ -663,6 +663,8 @@ bool BKE_cache_read_dupligroup(Main *bmain, Scene *scene, float frame, eCacheLib BKE_cache_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib, filename, sizeof(filename)); archive = PTC_open_reader_archive(scene, filename); + if (!archive) + return false; reader = PTC_reader_dupligroup(dupgroup->id.name, dupgroup, dupcache); PTC_reader_init(reader, archive); diff --git a/source/blender/editors/io/io_cache_library.c b/source/blender/editors/io/io_cache_library.c index 8ae8655ee4b..87fe9d7dbd2 100644 --- a/source/blender/editors/io/io_cache_library.c +++ b/source/blender/editors/io/io_cache_library.c @@ -510,6 +510,11 @@ static int cache_library_archive_info_exec(bContext *C, wmOperator *op) BKE_cache_archive_path(cachelib->filepath, (ID *)cachelib, cachelib->id.lib, filename, sizeof(filename)); archive = PTC_open_reader_archive(scene, filename); + if (!archive) { + BKE_reportf(op->reports, RPT_ERROR, "Cannot open cache file at '%s'", cachelib->filepath); + return OPERATOR_CANCELLED; + } + info = PTC_get_archive_info(archive); PTC_close_reader_archive(archive); diff --git a/source/blender/pointcache/PTC_api.cpp b/source/blender/pointcache/PTC_api.cpp index a37709def7d..a895ec9e895 100644 --- a/source/blender/pointcache/PTC_api.cpp +++ b/source/blender/pointcache/PTC_api.cpp @@ -97,7 +97,7 @@ const char *PTC_get_default_archive_extension(void) PTCWriterArchive *PTC_open_writer_archive(Scene *scene, const char *path) { - return (PTCWriterArchive *)PTC::Factory::alembic->create_writer_archive(scene, path, NULL); + return (PTCWriterArchive *)PTC::Factory::alembic->open_writer_archive(scene, path, NULL); } void PTC_close_writer_archive(PTCWriterArchive *_archive) @@ -108,7 +108,7 @@ void PTC_close_writer_archive(PTCWriterArchive *_archive) PTCReaderArchive *PTC_open_reader_archive(Scene *scene, const char *path) { - return (PTCReaderArchive *)PTC::Factory::alembic->create_reader_archive(scene, path, NULL); + return (PTCReaderArchive *)PTC::Factory::alembic->open_reader_archive(scene, path, NULL); } void PTC_close_reader_archive(PTCReaderArchive *_archive) diff --git a/source/blender/pointcache/alembic/abc_reader.cpp b/source/blender/pointcache/alembic/abc_reader.cpp index e02095a507e..732440c4891 100644 --- a/source/blender/pointcache/alembic/abc_reader.cpp +++ b/source/blender/pointcache/alembic/abc_reader.cpp @@ -35,14 +35,25 @@ namespace PTC { using namespace Abc; -AbcReaderArchive::AbcReaderArchive(Scene *scene, const std::string &filename, ErrorHandler *error_handler) : +AbcReaderArchive *AbcReaderArchive::open(Scene *scene, const std::string &filename, ErrorHandler *error_handler) +{ + IArchive abc_archive; + PTC_SAFE_CALL_BEGIN +// abc_archive = IArchive(AbcCoreHDF5::ReadArchive(), filename, Abc::ErrorHandler::kThrowPolicy); + abc_archive = IArchive(AbcCoreOgawa::ReadArchive(), filename, Abc::ErrorHandler::kThrowPolicy); + PTC_SAFE_CALL_END_HANDLER(error_handler) + + if (abc_archive) + return new AbcReaderArchive(scene, error_handler, abc_archive); + else + return NULL; +} + +AbcReaderArchive::AbcReaderArchive(Scene *scene, ErrorHandler *error_handler, IArchive abc_archive) : FrameMapper(scene), + archive(abc_archive), m_error_handler(error_handler) { - PTC_SAFE_CALL_BEGIN -// archive = IArchive(AbcCoreHDF5::ReadArchive(), filename, Abc::ErrorHandler::kThrowPolicy); - archive = IArchive(AbcCoreOgawa::ReadArchive(), filename, Abc::ErrorHandler::kThrowPolicy); - PTC_SAFE_CALL_END_HANDLER(m_error_handler) } AbcReaderArchive::~AbcReaderArchive() diff --git a/source/blender/pointcache/alembic/abc_reader.h b/source/blender/pointcache/alembic/abc_reader.h index 062752c3e3b..fd15f82ce49 100644 --- a/source/blender/pointcache/alembic/abc_reader.h +++ b/source/blender/pointcache/alembic/abc_reader.h @@ -40,9 +40,10 @@ using namespace Alembic; class AbcReaderArchive : public ReaderArchive, public FrameMapper { public: - AbcReaderArchive(Scene *scene, const std::string &filename, ErrorHandler *error_handler); virtual ~AbcReaderArchive(); + static AbcReaderArchive *open(Scene *scene, const std::string &filename, ErrorHandler *error_handler); + Abc::IObject get_id_object(ID *id); bool has_id_object(ID *id); @@ -54,6 +55,9 @@ public: Abc::IArchive archive; protected: + AbcReaderArchive(Scene *scene, ErrorHandler *error_handler, Abc::IArchive abc_archive); + +protected: ErrorHandler *m_error_handler; }; diff --git a/source/blender/pointcache/alembic/abc_writer.cpp b/source/blender/pointcache/alembic/abc_writer.cpp index c69e99751ce..e5612b3eff7 100644 --- a/source/blender/pointcache/alembic/abc_writer.cpp +++ b/source/blender/pointcache/alembic/abc_writer.cpp @@ -43,23 +43,32 @@ static void ensure_directory(const char *filename) BLI_dir_create_recursive(dir); } -AbcWriterArchive::AbcWriterArchive(Scene *scene, const std::string &filename, ErrorHandler *error_handler) : - FrameMapper(scene), - m_error_handler(error_handler) +AbcWriterArchive *AbcWriterArchive::open(Scene *scene, const std::string &filename, ErrorHandler *error_handler) { ensure_directory(filename.c_str()); + OArchive abc_archive; PTC_SAFE_CALL_BEGIN -// archive = OArchive(AbcCoreHDF5::WriteArchive(), filename, Abc::ErrorHandler::kThrowPolicy); - archive = OArchive(AbcCoreOgawa::WriteArchive(), filename, Abc::ErrorHandler::kThrowPolicy); +// abc_archive = OArchive(AbcCoreHDF5::WriteArchive(), filename, Abc::ErrorHandler::kThrowPolicy); + abc_archive = OArchive(AbcCoreOgawa::WriteArchive(), filename, Abc::ErrorHandler::kThrowPolicy); + PTC_SAFE_CALL_END_HANDLER(error_handler) + if (abc_archive) + return new AbcWriterArchive(scene, error_handler, abc_archive); + else + return NULL; +} + +AbcWriterArchive::AbcWriterArchive(Scene *scene, ErrorHandler *error_handler, OArchive abc_archive) : + FrameMapper(scene), + archive(abc_archive), + m_error_handler(error_handler) +{ if (archive) { chrono_t cycle_time = this->seconds_per_frame(); chrono_t start_time = this->start_time(); m_frame_sampling = archive.addTimeSampling(TimeSampling(cycle_time, start_time)); } - - PTC_SAFE_CALL_END_HANDLER(m_error_handler) } AbcWriterArchive::~AbcWriterArchive() diff --git a/source/blender/pointcache/alembic/abc_writer.h b/source/blender/pointcache/alembic/abc_writer.h index 5fa20a59122..4531d8dd27d 100644 --- a/source/blender/pointcache/alembic/abc_writer.h +++ b/source/blender/pointcache/alembic/abc_writer.h @@ -44,9 +44,10 @@ using namespace Alembic; class AbcWriterArchive : public WriterArchive, public FrameMapper { public: - AbcWriterArchive(Scene *scene, const std::string &filename, ErrorHandler *error_handler); virtual ~AbcWriterArchive(); + static AbcWriterArchive *open(Scene *scene, const std::string &filename, ErrorHandler *error_handler); + Abc::OObject get_id_object(ID *id); bool has_id_object(ID *id); @@ -59,6 +60,9 @@ public: Abc::OArchive archive; protected: + AbcWriterArchive(Scene *scene, ErrorHandler *error_handler, Abc::OArchive abc_archive); + +protected: ErrorHandler *m_error_handler; uint32_t m_frame_sampling; }; diff --git a/source/blender/pointcache/alembic/alembic.cpp b/source/blender/pointcache/alembic/alembic.cpp index e928fe0c62a..21df3f79079 100644 --- a/source/blender/pointcache/alembic/alembic.cpp +++ b/source/blender/pointcache/alembic/alembic.cpp @@ -37,14 +37,14 @@ class AbcFactory : public Factory { return ext; } - WriterArchive *create_writer_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) + WriterArchive *open_writer_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) { - return new AbcWriterArchive(scene, name, error_handler); + return AbcWriterArchive::open(scene, name, error_handler); } - ReaderArchive *create_reader_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) + ReaderArchive *open_reader_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) { - return new AbcReaderArchive(scene, name, error_handler); + return AbcReaderArchive::open(scene, name, error_handler); } Writer *create_writer_object(const std::string &name, Object *ob) diff --git a/source/blender/pointcache/intern/ptc_types.h b/source/blender/pointcache/intern/ptc_types.h index f2a892e7653..c7c074e9f5d 100644 --- a/source/blender/pointcache/intern/ptc_types.h +++ b/source/blender/pointcache/intern/ptc_types.h @@ -194,8 +194,8 @@ protected: struct Factory { virtual const std::string &get_default_extension() = 0; - virtual WriterArchive *create_writer_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) = 0; - virtual ReaderArchive *create_reader_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) = 0; + virtual WriterArchive *open_writer_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) = 0; + virtual ReaderArchive *open_reader_archive(Scene *scene, const std::string &name, ErrorHandler *error_handler) = 0; virtual Writer *create_writer_object(const std::string &name, Object *ob) = 0; virtual Reader *create_reader_object(const std::string &name, Object *ob) = 0; |