]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/cpio.c (canonicalize): Handle "..".
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 26 May 2012 22:54:41 +0000 (00:54 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 26 May 2012 22:54:41 +0000 (00:54 +0200)
(grub_cpio_find_file) [MODE_USTAR]: Handle hardlinks.

ChangeLog
grub-core/fs/cpio.c

index 36d0f6b9baa76f89a3f876c40b49fd380afd0902..07cb1a78557fc359b7a73490c393369b2f6cad68 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-27  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/fs/cpio.c (canonicalize): Handle "..".
+       (grub_cpio_find_file) [MODE_USTAR]: Handle hardlinks.
+
 2012-05-27  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/fs/btrfs.c (GRUB_BTRFS_ITEM_TYPE_INODE_REF): New enum value.
index 9234a29591c06de83de8301a19732f87344a8875..e9236cd97077bb6ce27b53d6bafaaac3f661b617 100644 (file)
@@ -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;