You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.8 KiB
59 lines
1.8 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Lenny Szubowicz <lszubowi@redhat.com> |
|
Date: Mon, 29 Aug 2016 11:04:48 -0400 |
|
Subject: [PATCH] Normalize slashes in tftp paths. |
|
|
|
Some tftp servers do not handle multiple consecutive slashes correctly; |
|
this patch avoids sending tftp requests with non-normalized paths. |
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com> |
|
--- |
|
grub-core/net/tftp.c | 28 +++++++++++++++++++++++++--- |
|
1 file changed, 25 insertions(+), 3 deletions(-) |
|
|
|
diff --git a/grub-core/net/tftp.c b/grub-core/net/tftp.c |
|
index 22a4debdcd4..8632339de97 100644 |
|
--- a/grub-core/net/tftp.c |
|
+++ b/grub-core/net/tftp.c |
|
@@ -300,6 +300,25 @@ destroy_pq (tftp_data_t data) |
|
grub_priority_queue_destroy (data->pq); |
|
} |
|
|
|
+/* Create a normalized copy of the filename. |
|
+ Compress any string of consecutive forward slashes to a single forward |
|
+ slash. */ |
|
+static void |
|
+grub_normalize_filename (char *normalized, const char *filename) |
|
+{ |
|
+ char *dest = normalized; |
|
+ char *src = filename; |
|
+ |
|
+ while (*src != '\0') |
|
+ { |
|
+ if (src[0] == '/' && src[1] == '/') |
|
+ src++; |
|
+ else |
|
+ *dest++ = *src++; |
|
+ } |
|
+ *dest = '\0'; |
|
+} |
|
+ |
|
static grub_err_t |
|
tftp_open (struct grub_file *file, const char *filename) |
|
{ |
|
@@ -334,9 +353,12 @@ tftp_open (struct grub_file *file, const char *filename) |
|
rrqlen = 0; |
|
|
|
tftph->opcode = grub_cpu_to_be16 (TFTP_RRQ); |
|
- grub_strcpy (rrq, filename); |
|
- rrqlen += grub_strlen (filename) + 1; |
|
- rrq += grub_strlen (filename) + 1; |
|
+ |
|
+ /* Copy and normalize the filename to work-around issues on some tftp |
|
+ servers when file names are being matched for remapping. */ |
|
+ grub_normalize_filename (rrq, filename); |
|
+ rrqlen += grub_strlen (rrq) + 1; |
|
+ rrq += grub_strlen (rrq) + 1; |
|
|
|
grub_strcpy (rrq, "octet"); |
|
rrqlen += grub_strlen ("octet") + 1;
|
|
|