Fix (unreported) unclear potential invalid readfile behavior on unknown BHead type.
This was likely never an issue so far, as no ID type has ever been removed (that was written in blendfiles at least), and no new BHead type has been added since ages. However, current behavior of the main loop in the readfile code (in `blo_read_file_internal`) is to consider any BHead type which is not explicitely known and handled, to be an ID BHead, and directly try to load it as such. This commit addresses that potential issue by validating that a BHead code actually matches a known ID type before trying to use it to read an ID from the file. Issue identified while working on designs for future 5.0 forward compatibility breaking changes in blendfile format itself. Pull Request: https://projects.blender.org/blender/blender/pulls/129693
This commit is contained in:
committed by
Bastien Montagne
parent
2f6197daa9
commit
6ba58a8303
@@ -3619,13 +3619,22 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
|
||||
bhead->code = ID_SCR;
|
||||
/* pass on to default */
|
||||
ATTR_FALLTHROUGH;
|
||||
default:
|
||||
if (fd->skip_flags & BLO_READ_SKIP_DATA) {
|
||||
bhead = blo_bhead_next(fd, bhead);
|
||||
default: {
|
||||
if (blo_bhead_is_id_valid_type(bhead)) {
|
||||
/* BHead is a valid known ID type one, read the whole ID and its sub-data, unless reading
|
||||
* actual data is skipped. */
|
||||
if (fd->skip_flags & BLO_READ_SKIP_DATA) {
|
||||
bhead = blo_bhead_next(fd, bhead);
|
||||
}
|
||||
else {
|
||||
bhead = read_libblock(fd, bfd->main, bhead, ID_TAG_LOCAL, false, nullptr);
|
||||
}
|
||||
}
|
||||
else {
|
||||
bhead = read_libblock(fd, bfd->main, bhead, ID_TAG_LOCAL, false, nullptr);
|
||||
/* Unknown BHead type (or ID type), ignore it and skip to next BHead. */
|
||||
bhead = blo_bhead_next(fd, bhead);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bfd->main->is_read_invalid) {
|
||||
|
||||
Reference in New Issue
Block a user