Bug fix: Non-SUSP data in System Use Area prevented image loading if Rock Ridge was enabled. Thanks to Jonathan Dowland.
This commit is contained in:
parent
01020ef544
commit
8ec75eea6a
@ -1582,7 +1582,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
{ret = ISO_OUT_OF_MEM; goto ex;}
|
{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 */
|
/* ignore entries from different version */
|
||||||
if (sue->version[0] != 1)
|
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 */
|
/* 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) {
|
if (ret < 0) {
|
||||||
/* error */
|
/* error */
|
||||||
susp_iter_free(iter);
|
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
|
* no?), but if we finally need it, it can be easily implemented in
|
||||||
* the iterator, transparently for the rest of the code.
|
* 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 */
|
/* ignore entries from different version */
|
||||||
if (sue->version[0] != 1)
|
if (sue->version[0] != 1)
|
||||||
|
@ -266,7 +266,8 @@ susp_iter_new(IsoDataSource *src, struct ecma119_dir_record *record,
|
|||||||
* @return
|
* @return
|
||||||
* 1 on success, 0 if no more entries, < 0 error
|
* 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.
|
* Free a given susp iterator.
|
||||||
|
@ -67,12 +67,26 @@ susp_iter_new(IsoDataSource *src, struct ecma119_dir_record *record,
|
|||||||
return iter;
|
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;
|
struct susp_sys_user_entry *entry;
|
||||||
|
|
||||||
entry = (struct susp_sys_user_entry*)(iter->base + iter->pos);
|
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'))) {
|
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 */
|
/* 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')) {
|
} else if (SUSP_SIG(entry, 'P', 'D')) {
|
||||||
/* skip padding */
|
/* skip padding */
|
||||||
return susp_iter_next(iter, sue);
|
return susp_iter_next(iter, sue, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
*sue = entry;
|
*sue = entry;
|
||||||
|
Loading…
Reference in New Issue
Block a user