From 17fc1314e398d7ab2f3ae5a6d1114543653e8a91 Mon Sep 17 00:00:00 2001 From: Lenny Szubowicz Date: Mon, 29 Aug 2016 11:04:48 -0400 Subject: [PATCH 147/198] 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 --- grub-core/net/tftp.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/grub-core/net/tftp.c b/grub-core/net/tftp.c index 1157524fc..5ca0a96a6 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) { @@ -337,7 +356,10 @@ tftp_open (struct grub_file *file, const char *filename) rrqlen = 0; tftph->opcode = grub_cpu_to_be16_compile_time (TFTP_RRQ); - grub_strcpy (rrq, filename); + + /* 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 (filename) + 1; rrq += grub_strlen (filename) + 1; -- 2.14.3