]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/cpio.c (grub_cpio_dir): Handle subdirs correctly.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 25 Nov 2011 13:12:05 +0000 (14:12 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 25 Nov 2011 13:12:05 +0000 (14:12 +0100)
ChangeLog
grub-core/fs/cpio.c

index 50d552fcfea5f9f992b9a210b52fddf5487e5cbf..d75957f5740a567d7cb432e575b52e9a237dfa98 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-11-25  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/fs/cpio.c (grub_cpio_dir): Handle subdirs correctly.
+
 2011-11-16  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/kern/dl.c (grub_dl_load_segments): Fix alignment handling.
index 39b35b33590084b5306a1f30c6203af491419c75..63a1d1f4361a11c0d8d051a35f6a51de225eb568 100644 (file)
@@ -404,13 +404,15 @@ grub_cpio_dir (grub_device_t device, const char *path_in,
 {
   struct grub_cpio_data *data;
   grub_disk_addr_t ofs;
-  char *prev, *name, *path;
+  char *prev, *name, *path, *ptr;
   grub_size_t len;
   int symlinknest = 0;
 
   path = grub_strdup (path_in + 1);
   if (!path)
     return grub_errno;
+  for (ptr = path + grub_strlen (path) - 1; ptr >= path && *ptr == '/'; ptr--)
+    *ptr = 0;
 
   grub_dl_ref (my_mod);
 
@@ -443,14 +445,14 @@ grub_cpio_dir (grub_device_t device, const char *path_in,
          char *p, *n;
 
          n = name + len;
-         if (*n == '/')
+         while (*n == '/')
            n++;
 
-         p = grub_strchr (name + len, '/');
+         p = grub_strchr (n, '/');
          if (p)
            *p = 0;
 
-         if (((!prev) || (grub_strcmp (prev, name) != 0)) && name[len] != 0)
+         if (((!prev) || (grub_strcmp (prev, n) != 0)) && *n != 0)
            {
              struct grub_dirhook_info info;
              grub_memset (&info, 0, sizeof (info));
@@ -458,7 +460,7 @@ grub_cpio_dir (grub_device_t device, const char *path_in,
              info.mtime = mtime;
              info.mtimeset = 1;
 
-             hook (name + len, &info);
+             hook (n, &info);
              grub_free (prev);
              prev = name;
            }