From 742d2be63a8f16d48597cd387f1d959d04065444 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Thu, 10 May 2012 23:35:03 +0200 Subject: [PATCH] * grub-core/fs/iso9660.c (grub_iso9660_iterate_dir): Fix symlink handling. --- ChangeLog | 5 +++++ grub-core/fs/iso9660.c | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index aee8654db..5e9d1a424 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-05-10 Vladimir Serbinenko + + * grub-core/fs/iso9660.c (grub_iso9660_iterate_dir): Fix symlink + handling. + 2012-05-10 Vladimir Serbinenko * grub-core/fs/ufs.c (grub_ufs_find_file): Fix handling of double slash. diff --git a/grub-core/fs/iso9660.c b/grub-core/fs/iso9660.c index 394fe4486..992de35b6 100644 --- a/grub-core/fs/iso9660.c +++ b/grub-core/fs/iso9660.c @@ -533,6 +533,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir, enum grub_fshelp_filetype type; grub_off_t len; char *symlink = 0; + int was_continue = 0; /* Extend the symlink. */ auto inline void __attribute__ ((always_inline)) add_part (const char *part, @@ -630,11 +631,11 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir, /* The data on pos + 2 is the actual data, pos + 1 is the length. Both are part of the `Component Record'. */ - if (symlink && (entry->data[pos] & 1)) + if (symlink && !was_continue) add_part ("/", 1); add_part ((char *) &entry->data[pos + 2], entry->data[pos + 1]); - + was_continue = (entry->data[pos] & 1); break; } @@ -668,6 +669,7 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir, for (; offset < len; offset += dirent.len) { symlink = 0; + was_continue = 0; if (read_node (dir, offset, sizeof (dirent), (char *) &dirent)) return 0; @@ -817,6 +819,8 @@ grub_iso9660_iterate_dir (grub_fshelp_node_t dir, + node->have_dirents * sizeof (node->dirents[0]) - sizeof (node->dirents), symlink); grub_free (symlink); + symlink = 0; + was_continue = 0; } if (hook (filename, type, node)) {