fs/iso9660: Add check to prevent infinite loop

There is no check for the end of block when reading
directory extents. It resulted in read_node() always
read from the same offset in the while loop, thus
caused infinite loop. The fix added a check for the
end of the block and ensure the read is within directory
boundary.

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Lidong Chen authored and Daniel Kiper committed 2023-02-02 19:43:50 +01:00
1 parent b073ce8d88
commit 4e0bab34ec
1 file changed
+22
+22
View File
@@ -801,6 +801,16 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
while (dirent.flags & FLAG_MORE_EXTENTS) while (dirent.flags & FLAG_MORE_EXTENTS)
{ {
offset += dirent.len; offset += dirent.len;
/* offset should within the dir's len. */
if (offset > len)
{
if (ctx.filename_alloc)
grub_free (ctx.filename);
grub_free (node);
return 0;
}
if (read_node (dir, offset, sizeof (dirent), (char *) &dirent)) if (read_node (dir, offset, sizeof (dirent), (char *) &dirent))
{ {
if (ctx.filename_alloc) if (ctx.filename_alloc)
@@ -808,6 +818,18 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir,
grub_free (node); grub_free (node);
return 0; return 0;
} }
/*
* It is either the end of block or zero-padded sector,
* skip to the next block.
*/
if (!dirent.len)
{
offset = (offset / GRUB_ISO9660_BLKSZ + 1) * GRUB_ISO9660_BLKSZ;
dirent.flags |= FLAG_MORE_EXTENTS;
continue;
}
if (node->have_dirents >= node->alloc_dirents) if (node->have_dirents >= node->alloc_dirents)
{ {
struct grub_fshelp_node *new_node; struct grub_fshelp_node *new_node;