mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 14:59:34 +00:00
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:
1 parent
b073ce8d88
commit
4e0bab34ec
1 file changed
+22
@@ -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;
|
||||||
|
|||||||
Reference in new issue
Block a user