]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/kern/efi/efi.c: Ensure that the result starts with /
authorVladimir Serbinenko <phcoder@gmail.com>
Sat, 18 Jan 2014 15:41:47 +0000 (16:41 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sat, 18 Jan 2014 15:41:47 +0000 (16:41 +0100)
and has no //.

ChangeLog
grub-core/kern/efi/efi.c

index 6a19f850448d2cae5636950b959362f6343e3cae..b04a4ef70b9bf66116cae4ac6e0401ea7cd0bb27 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-18  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/kern/efi/efi.c: Ensure that the result starts with /
+       and has no //.
+
 2014-01-18  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * NEWS: Add few missing entries.
index b253141f26ebb6d9fd997ad3609cef89c41db854..b9eb1ab1e33dfdf88dda955343df5574c6ee7d45 100644 (file)
@@ -309,7 +309,7 @@ grub_efi_modules_addr (void)
 char *
 grub_efi_get_filename (grub_efi_device_path_t *dp0)
 {
-  char *name = 0, *p;
+  char *name = 0, *p, *pi;
   grub_size_t filesize = 0;
   grub_efi_device_path_t *dp;
 
@@ -328,7 +328,7 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
          grub_efi_uint16_t len;
          len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
                 / sizeof (grub_efi_char16_t));
-         filesize += GRUB_MAX_UTF8_PER_UTF16 * len + 1;
+         filesize += GRUB_MAX_UTF8_PER_UTF16 * len + 2;
        }
 
       dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
@@ -356,12 +356,12 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
          grub_efi_file_path_device_path_t *fp;
          grub_efi_uint16_t len;
 
-         if (p != name)
-           *p++ = '/';
+         *p++ = '/';
 
          len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
                 / sizeof (grub_efi_char16_t));
          fp = (grub_efi_file_path_device_path_t *) dp;
+
          p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len);
        }
 
@@ -370,10 +370,19 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
 
   *p = '\0';
 
-  /* EFI breaks paths with backslashes.  */
-  for (p = name; *p; p++)
-    if (*p == '\\')
-      *p = '/';
+  for (pi = name, p = name; *pi;)
+    {
+      /* EFI breaks paths with backslashes.  */
+      if (*pi == '\\' || *pi == '/')
+       {
+         *p++ = '/';
+         while (*pi == '\\' || *pi == '/')
+           pi++;
+         continue;
+       }
+      *p++ = *pi++;
+    }
+  *p = '\0';
 
   return name;
 }