011fe81
From 29c96f00677e1dd2a9df4de645a7f5fab7b736a1 Mon Sep 17 00:00:00 2001
78a3d7d
From: Vladimir Serbinenko <phcoder@gmail.com>
78a3d7d
Date: Sat, 18 Jan 2014 16:41:47 +0100
58fe9aa
Subject: [PATCH 020/152] 	* grub-core/kern/efi/efi.c: Ensure that the
78a3d7d
 result starts with / 	and has no //.
78a3d7d
78a3d7d
---
78a3d7d
 ChangeLog                |  5 +++++
78a3d7d
 grub-core/kern/efi/efi.c | 25 +++++++++++++++++--------
78a3d7d
 2 files changed, 22 insertions(+), 8 deletions(-)
78a3d7d
78a3d7d
diff --git a/ChangeLog b/ChangeLog
011fe81
index 6a19f85..b04a4ef 100644
78a3d7d
--- a/ChangeLog
78a3d7d
+++ b/ChangeLog
78a3d7d
@@ -1,5 +1,10 @@
78a3d7d
 2014-01-18  Vladimir Serbinenko  <phcoder@gmail.com>
78a3d7d
 
78a3d7d
+	* grub-core/kern/efi/efi.c: Ensure that the result starts with /
78a3d7d
+	and has no //.
78a3d7d
+
78a3d7d
+2014-01-18  Vladimir Serbinenko  <phcoder@gmail.com>
78a3d7d
+
78a3d7d
 	* NEWS: Add few missing entries.
78a3d7d
 
78a3d7d
 2014-01-17  Colin Watson  <cjwatson@ubuntu.com>
78a3d7d
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
78a3d7d
index b253141..b9eb1ab 100644
78a3d7d
--- a/grub-core/kern/efi/efi.c
78a3d7d
+++ b/grub-core/kern/efi/efi.c
78a3d7d
@@ -309,7 +309,7 @@ grub_efi_modules_addr (void)
78a3d7d
 char *
78a3d7d
 grub_efi_get_filename (grub_efi_device_path_t *dp0)
78a3d7d
 {
78a3d7d
-  char *name = 0, *p;
78a3d7d
+  char *name = 0, *p, *pi;
78a3d7d
   grub_size_t filesize = 0;
78a3d7d
   grub_efi_device_path_t *dp;
78a3d7d
 
78a3d7d
@@ -328,7 +328,7 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
78a3d7d
 	  grub_efi_uint16_t len;
78a3d7d
 	  len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
78a3d7d
 		 / sizeof (grub_efi_char16_t));
78a3d7d
-	  filesize += GRUB_MAX_UTF8_PER_UTF16 * len + 1;
78a3d7d
+	  filesize += GRUB_MAX_UTF8_PER_UTF16 * len + 2;
78a3d7d
 	}
78a3d7d
 
78a3d7d
       dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
78a3d7d
@@ -356,12 +356,12 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
78a3d7d
 	  grub_efi_file_path_device_path_t *fp;
78a3d7d
 	  grub_efi_uint16_t len;
78a3d7d
 
78a3d7d
-	  if (p != name)
78a3d7d
-	    *p++ = '/';
78a3d7d
+	  *p++ = '/';
78a3d7d
 
78a3d7d
 	  len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
78a3d7d
 		 / sizeof (grub_efi_char16_t));
78a3d7d
 	  fp = (grub_efi_file_path_device_path_t *) dp;
78a3d7d
+
78a3d7d
 	  p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len);
78a3d7d
 	}
78a3d7d
 
78a3d7d
@@ -370,10 +370,19 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
78a3d7d
 
78a3d7d
   *p = '\0';
78a3d7d
 
78a3d7d
-  /* EFI breaks paths with backslashes.  */
78a3d7d
-  for (p = name; *p; p++)
78a3d7d
-    if (*p == '\\')
78a3d7d
-      *p = '/';
78a3d7d
+  for (pi = name, p = name; *pi;)
78a3d7d
+    {
78a3d7d
+      /* EFI breaks paths with backslashes.  */
78a3d7d
+      if (*pi == '\\' || *pi == '/')
78a3d7d
+	{
78a3d7d
+	  *p++ = '/';
78a3d7d
+	  while (*pi == '\\' || *pi == '/')
78a3d7d
+	    pi++;
78a3d7d
+	  continue;
78a3d7d
+	}
78a3d7d
+      *p++ = *pi++;
78a3d7d
+    }
78a3d7d
+  *p = '\0';
78a3d7d
 
78a3d7d
   return name;
78a3d7d
 }
78a3d7d
-- 
37b39b7
1.9.3
78a3d7d