diff --git a/libisofs/fs_image.c b/libisofs/fs_image.c index b959233..15ec540 100644 --- a/libisofs/fs_image.c +++ b/libisofs/fs_image.c @@ -1582,7 +1582,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent, {ret = ISO_OUT_OF_MEM; goto ex;} } - while ((ret = susp_iter_next(iter, &sue)) > 0) { + while ((ret = susp_iter_next(iter, &sue, 0)) > 0) { /* ignore entries from different version */ if (sue->version[0] != 1) @@ -2398,7 +2398,7 @@ int read_root_susp_entries(_ImageFsData *data, uint32_t block) } /* first entry must be an SP system use entry */ - ret = susp_iter_next(iter, &sue); + ret = susp_iter_next(iter, &sue, 1); if (ret < 0) { /* error */ susp_iter_free(iter); @@ -2442,7 +2442,7 @@ int read_root_susp_entries(_ImageFsData *data, uint32_t block) * no?), but if we finally need it, it can be easily implemented in * the iterator, transparently for the rest of the code. */ - while ((ret = susp_iter_next(iter, &sue)) > 0) { + while ((ret = susp_iter_next(iter, &sue, 0)) > 0) { /* ignore entries from different version */ if (sue->version[0] != 1) diff --git a/libisofs/rockridge.h b/libisofs/rockridge.h index 887e950..88eed0a 100644 --- a/libisofs/rockridge.h +++ b/libisofs/rockridge.h @@ -266,7 +266,8 @@ susp_iter_new(IsoDataSource *src, struct ecma119_dir_record *record, * @return * 1 on success, 0 if no more entries, < 0 error */ -int susp_iter_next(SuspIterator *iter, struct susp_sys_user_entry **sue); +int susp_iter_next(SuspIterator *iter, struct susp_sys_user_entry **sue, + int flag); /** * Free a given susp iterator. diff --git a/libisofs/rockridge_read.c b/libisofs/rockridge_read.c index b44c61d..4dbc78a 100644 --- a/libisofs/rockridge_read.c +++ b/libisofs/rockridge_read.c @@ -67,12 +67,26 @@ susp_iter_new(IsoDataSource *src, struct ecma119_dir_record *record, return iter; } -int susp_iter_next(SuspIterator *iter, struct susp_sys_user_entry **sue) +/* @param flag bit0 = First call on root: + Not yet clear whether this is SUSP at all +*/ +int susp_iter_next(SuspIterator *iter, struct susp_sys_user_entry **sue, + int flag) { struct susp_sys_user_entry *entry; entry = (struct susp_sys_user_entry*)(iter->base + iter->pos); + if (flag & 1) { + /* Yet unclear whether it is SUSP at all */ + if (iter->size < 7) + return 0; + if (!SUSP_SIG(entry, 'S', 'P')) + return 0; + if (entry->len_sue[0] < 7) + return 0; + /* Looks like SUSP enough to pass the further processing here. */ + } if ( (iter->pos + 4 > iter->size) || (SUSP_SIG(entry, 'S', 'T'))) { /* @@ -134,10 +148,10 @@ int susp_iter_next(SuspIterator *iter, struct susp_sys_user_entry **sue) } /* we don't want to return CE entry to the user */ - return susp_iter_next(iter, sue); + return susp_iter_next(iter, sue, 0); } else if (SUSP_SIG(entry, 'P', 'D')) { /* skip padding */ - return susp_iter_next(iter, sue); + return susp_iter_next(iter, sue, 0); } *sue = entry;