diff --git a/ChangeLog b/ChangeLog index 36d0f6b9b..07cb1a785 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-05-27 Vladimir Serbinenko + + * grub-core/fs/cpio.c (canonicalize): Handle "..". + (grub_cpio_find_file) [MODE_USTAR]: Handle hardlinks. + 2012-05-27 Vladimir Serbinenko * grub-core/fs/btrfs.c (GRUB_BTRFS_ITEM_TYPE_INODE_REF): New enum value. diff --git a/grub-core/fs/cpio.c b/grub-core/fs/cpio.c index 9234a2959..e9236cd97 100644 --- a/grub-core/fs/cpio.c +++ b/grub-core/fs/cpio.c @@ -142,6 +142,15 @@ canonicalize (char *name) iptr += 2; continue; } + if (iptr[0] == '.' && iptr[1] == '.' && (iptr[2] == '/' || iptr[2] == 0)) + { + iptr += 3; + if (optr == name) + continue; + for (optr -= 2; optr >= name && *optr != '/'; optr--); + optr++; + continue; + } while (*iptr && *iptr != '/') *optr++ = *iptr++; if (*iptr) @@ -341,6 +350,9 @@ grub_cpio_find_file (struct grub_cpio_data *data, char **name, *mode = read_number (hd.mode, sizeof (hd.mode)); switch (hd.typeflag) { + /* Hardlink. */ + case '1': + /* Symlink. */ case '2': *mode |= ATTR_LNK; break;