[Bf-blender-cvs] [7c7d564] alembic_pointcache: Safeguard against crashes from invalid Alembic file paths by returning NULL archive pointers.

Lukas Tönne noreply at git.blender.org
Wed Mar 18 14:09:14 CET 2015


Commit: 7c7d5645ca903b6ec013fae16709022733ce6b42
Author: Lukas Tönne
Date:   Wed Mar 18 14:06:00 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rB7c7d5645ca903b6ec013fae16709022733ce6b42

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.

===================================================================

M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/editors/io/io_cache_library.c
M	source/blender/pointcache/PTC_api.cpp
M	source/blender/pointcache/alembic/abc_reader.cpp
M	source/blender/pointcache/alembic/abc_reader.h
M	source/blender/pointcache/alembic/abc_writer.cpp
M	source/blender/pointcache/alembic/abc_writer.h
M	source/blender/pointcache/alembic/alembic.cpp
M	source/blender/pointcache/intern/ptc_types.h

===================================================================

diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index fdb253a..20d2b77 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 8ae8655..87fe9d7 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 a37709d..a895ec9 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 e02095a..732440c 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 062752c..fd15f82 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 c69e997..e5612b3 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 5fa20a5..4531d8d 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 e928fe0..21df3f7 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 f2a892e..c7c074e 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;




More information about the Bf-blender-cvs mailing list