Having // at the beginning of the path may have special meaning according
to posix. I don't know if it applies in particular case and if the special
meaning is useful for grub to begin with, just something to check

On Thu, 31 Oct 2019, 11:37 Javier Martinez Canillas, <javi...@redhat.com>
wrote:

> 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
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to