Fix (studio-reported) crash in some rare cases in blendfile read code.
Crash would happen when a linked ID would become missing, that was 'pre-declared' and used only once as a 'weak link' in another library stored before the one it came from. In that case, the place-holder generated in read code would be freed in `read_library_clear_weak_links`, when handling its 'owner' library, but since all previous libraries in the list had already been 'lib_linked' and their filedata (and related libmap) freed, the update of the libmaps in `read_library_clear_weak_links` would not apply to data from those previous libraries, leading to ID pointers there pointing to freed memory. This fix should also be backported to 2.93.
This commit is contained in:
parent
c49717a824
commit
f3be8e66d7
Notes:
blender-bot
2023-02-14 05:50:03 +01:00
Referenced by issue #88449: Blender LTS: Maintenance Task 2.93 Referenced by issue #88449, Blender LTS: Maintenance Task 2.93
|
@ -4901,11 +4901,15 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
|
|||
}
|
||||
}
|
||||
|
||||
for (Main *mainptr = mainl->next; mainptr; mainptr = mainptr->next) {
|
||||
/* Drop weak links for which no data-block was found.
|
||||
* Since this can remap pointers in `libmap` of all libraries, it needs to be performed in its
|
||||
* own loop, before any call to `lib_link_all` (and the freeing of the libraries' filedata). */
|
||||
read_library_clear_weak_links(basefd, mainlist, mainptr);
|
||||
}
|
||||
|
||||
Main *main_newid = BKE_main_new();
|
||||
for (Main *mainptr = mainl->next; mainptr; mainptr = mainptr->next) {
|
||||
/* Drop weak links for which no data-block was found. */
|
||||
read_library_clear_weak_links(basefd, mainlist, mainptr);
|
||||
|
||||
/* Do versioning for newly added linked data-blocks. If no data-blocks
|
||||
* were read from a library versionfile will still be zero and we can
|
||||
* skip it. */
|
||||
|
|
Loading…
Reference in New Issue