tftp: 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: Lenny Szubowicz <lszubowi@redhat.com> Signed-off-by: Mark Salter <msalter@redhat.com> Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
5e5a15872d
commit
e2c09aed97
1 changed files with 28 additions and 3 deletions
|
@ -300,6 +300,26 @@ destroy_pq (tftp_data_t data)
|
||||||
grub_priority_queue_destroy (data->pq);
|
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
|
static grub_err_t
|
||||||
tftp_open (struct grub_file *file, const char *filename)
|
tftp_open (struct grub_file *file, const char *filename)
|
||||||
{
|
{
|
||||||
|
@ -337,9 +357,14 @@ tftp_open (struct grub_file *file, const char *filename)
|
||||||
rrqlen = 0;
|
rrqlen = 0;
|
||||||
|
|
||||||
tftph->opcode = grub_cpu_to_be16_compile_time (TFTP_RRQ);
|
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");
|
grub_strcpy (rrq, "octet");
|
||||||
rrqlen += grub_strlen ("octet") + 1;
|
rrqlen += grub_strlen ("octet") + 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue