Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2015-03-18 16:06:00 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-03-26 16:13:39 +0300
commit0e70ddfe14dfab28657087c779c1a37e3db295d8 (patch)
treec7350c29dcbf62a84e299bb4b3039b08164f3901 /source
parentf5b360b4daf580468c5ae7c1fa9ccff25f6bdf7a (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.c2
-rw-r--r--source/blender/editors/io/io_cache_library.c5
-rw-r--r--source/blender/pointcache/PTC_api.cpp4
-rw-r--r--source/blender/pointcache/alembic/abc_reader.cpp21
-rw-r--r--source/blender/pointcache/alembic/abc_reader.h6
-rw-r--r--source/blender/pointcache/alembic/abc_writer.cpp23
-rw-r--r--source/blender/pointcache/alembic/abc_writer.h6
-rw-r--r--source/blender/pointcache/alembic/alembic.cpp8
-rw-r--r--source/blender/pointcache/intern/ptc_types.h4
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;