Commit: 22f73fe951f1afb9355aa5239ff8cd8eabc52d3e Author: Sybren A. Stüvel Date: Mon Jul 3 12:30:37 2017 +0200 Branches: temp-sybren-alembic-filestreams https://developer.blender.org/rB22f73fe951f1afb9355aa5239ff8cd8eabc52d3e
Alembic: avoid crashing when doing certain file operations. Things like missing directories are now properly checked for, rather than crashing Blender. This also adds support for relative paths when opening an ABC file. =================================================================== M source/blender/alembic/intern/alembic_capi.cc M source/blender/editors/io/io_alembic.c =================================================================== diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc index 83d971d00d9..cd7f4180533 100644 --- a/source/blender/alembic/intern/alembic_capi.cc +++ b/source/blender/alembic/intern/alembic_capi.cc @@ -972,12 +972,14 @@ void CacheReader_incref(CacheReader *reader) CacheReader *CacheReader_open_alembic_object(AbcArchiveHandle *handle, CacheReader *reader, Object *object, const char *object_path) { if (object_path[0] == '\0') { + std::cerr << "CacheReader_open_alembic_object(): returning " << reader << "\n"; return reader; } ArchiveReader *archive = archive_from_handle(handle); if (!archive || !archive->valid()) { + std::cerr << "CacheReader_open_alembic_object(): returning " << reader << " because the archive doesn't exist or is invalid\n"; return reader; } @@ -985,10 +987,12 @@ CacheReader *CacheReader_open_alembic_object(AbcArchiveHandle *handle, CacheRead find_iobject(archive->getTop(), iobject, object_path); if (reader) { + std::cerr << "CacheReader_open_alembic_object(): freeing " << reader << "\n"; CacheReader_free(reader); } ImportSettings settings; + std::cerr << "CacheReader_open_alembic_object(): creating reader to replace " << reader << "\n"; AbcObjectReader *abc_reader = create_reader(iobject, settings); abc_reader->object(object); abc_reader->incref(); diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c index fb20d9f3caa..ca4ab30a08d 100644 --- a/source/blender/editors/io/io_alembic.c +++ b/source/blender/editors/io/io_alembic.c @@ -31,6 +31,9 @@ # include "BLI_winstuff.h" #endif +#include <string.h> +#include <errno.h> + #include "MEM_guardedalloc.h" #include "DNA_mesh_types.h" @@ -417,9 +420,20 @@ static int get_sequence_len(char *filename, int *ofs) } char path[FILE_MAX]; + BLI_path_abs(filename, G.main->name); BLI_split_dir_part(filename, path, FILE_MAX); + if (path[0] == '\0') { + /* The filename had no path, so just use the blend file path. */ + BLI_split_dir_part(G.main->name, path, FILE_MAX); + } + DIR *dir = opendir(path); + if (dir == NULL) { + fprintf(stderr, "Error opening directory '%s': %s\n", + path, errno ? strerror(errno) : "unknown error"); + return -1; + } const char *ext = ".abc"; const char *basename = BLI_path_basename(filename); @@ -523,6 +537,10 @@ static int wm_alembic_import_exec(bContext *C, wmOperator *op) if (is_sequence) { sequence_len = get_sequence_len(filename, &offset); + if (sequence_len < 0) { + BKE_report(op->reports, RPT_ERROR, "Unable to determine ABC sequence length"); + return OPERATOR_CANCELLED; + } } bool ok = ABC_import(C, filename, scale, is_sequence, set_frame_range, _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs