Partially fix & comment about bad handling of `wrong_id` in `read_libblock()`.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 28 Jan 2020 14:46:51 +0000 (15:46 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 28 Jan 2020 15:09:57 +0000 (16:09 +0100)
Not fully fixing it for now since I do not see an easy way to remove freed
pointer from libmap, and it does not seem to be an actual, practical
issue currently, but eeek...

source/blender/blenloader/intern/readfile.c

index 0ebff916cf9b1a9a13aa592c324daae15370cc5b..f6cf68f7daf807bbfe7a0e65b2091fffbdd3fc40 100644 (file)
@@ -9315,6 +9315,9 @@ static BHead *read_libblock(FileData *fd,
   ID *id;
   ListBase *lb;
   const char *allocname;
+
+  /* XXX Very weakly handled currently, see comment at the end of this function before trying to
+   * use it for anything new. */
   bool wrong_id = false;
 
   /* In undo case, most libs and linked data should be kept as is from previous state
@@ -9570,7 +9573,14 @@ static BHead *read_libblock(FileData *fd,
   oldnewmap_clear(fd->datamap);
 
   if (wrong_id) {
+    /* XXX This is probably working OK currently given the very limited scope of that flag.
+     * However, it is absolutely **not** handled correctly: it is freeing an ID pointer that has
+     * been added to the fd->libmap mapping, which in theory could lead to nice crashes...
+     * This should be properly solved at some point. */
     BKE_id_free(main, id);
+    if (r_id != NULL) {
+      *r_id = NULL;
+    }
   }
 
   return (bhead);