From: Lenny Szubowicz <lszub...@redhat.com> Some tftp servers do not handle multiple consecutive slashes correctly; this patch avoids sending tftp requests with non-normalized paths.
Signed-off-by: Lenny Szubowicz <lszub...@redhat.com> Signed-off-by: Mark Salter <msal...@redhat.com> Signed-off-by: Javier Martinez Canillas <javi...@redhat.com> --- grub-core/net/tftp.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git grub-core/net/tftp.c grub-core/net/tftp.c index 7d90bf66e76..6dbb9cdbb7a 100644 --- grub-core/net/tftp.c +++ 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; + const 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,9 +356,12 @@ 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); - 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; -- 2.21.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel