>From 1827c48034d2387819629c4b28d7c2910b5d889b Mon Sep 17 00:00:00 2001
From: Frediano Ziglio <[email protected]>
Date: Mon, 13 May 2013 15:58:32 +0100
Subject: [PATCH] Fix loading tftp file from pxe bios call

If filename contained '#' tftp does not load correctly file cause url was not
quoted correctly.

This patch actually fix two paths in the code that require quoting filename:
- loading file from dhcp;
- loading file from PXE calls.

Signed-off-by: Frediano Ziglio <[email protected]>
---
 src/arch/i386/interface/pxe/pxe_tftp.c |   13 ++++++++++---
 src/usr/autoboot.c                     |    8 +++++---
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/arch/i386/interface/pxe/pxe_tftp.c 
b/src/arch/i386/interface/pxe/pxe_tftp.c
index f4801ba..90599fd 100644
--- a/src/arch/i386/interface/pxe/pxe_tftp.c
+++ b/src/arch/i386/interface/pxe/pxe_tftp.c
@@ -31,6 +31,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <byteswap.h>
 #include <ipxe/uaccess.h>
 #include <ipxe/in.h>
+#include <ipxe/uri.h>
+#include <ipxe/vsprintf.h>
 #include <ipxe/tftp.h>
 #include <ipxe/iobuf.h>
 #include <ipxe/xfer.h>
@@ -174,6 +176,7 @@ static int pxe_tftp_open ( uint32_t ipaddress, unsigned int 
port,
                           const unsigned char *filename, size_t blksize,
                           int sizeonly ) {
        char uri_string[PXE_TFTP_URI_LEN];
+       ssize_t len;
        struct in_addr address;
        int rc;
 
@@ -189,10 +192,14 @@ static int pxe_tftp_open ( uint32_t ipaddress, unsigned 
int port,
        address.s_addr = ipaddress;
        if ( ! port )
                port = htons ( TFTP_PORT );
-       snprintf ( uri_string, sizeof ( uri_string ), "tftp%s://%s:%d%s%s",
+       len = snprintf ( uri_string, sizeof ( uri_string ), "tftp%s://%s:%d%s",
                   sizeonly ? "size" : "", inet_ntoa ( address ),
-                  ntohs ( port ), ( ( filename[0] == '/' ) ? "" : "/" ),
-                  filename );
+                  ntohs ( port ), ( ( filename[0] == '/' ) ? "" : "/" ) );
+       len += uri_encode( (const char *) filename, uri_string + len, sizeof ( 
uri_string ) - len, URI_PATH);
+       if ( len >= (ssize_t) sizeof ( uri_string ) ) {
+               return -ENAMETOOLONG;
+       }
+       uri_string[len] = 0;
        DBG ( " %s", uri_string );
 
        /* Open PXE TFTP connection */
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index b2d288e..4359dfe 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -91,9 +91,10 @@ static struct net_device * find_boot_netdev ( void ) {
  */
 static struct uri * parse_next_server_and_filename ( struct in_addr 
next_server,
                                                     const char *filename ) {
-       char buf[ 23 /* "tftp://xxx.xxx.xxx.xxx/"; */ + strlen ( filename )
+       char buf[ 23 /* "tftp://xxx.xxx.xxx.xxx/"; */ + 3 * strlen ( filename )
                  + 1 /* NUL */ ];
        struct uri *uri;
+       int len;
 
        /* Parse filename */
        uri = parse_uri ( filename );
@@ -108,8 +109,9 @@ static struct uri * parse_next_server_and_filename ( struct 
in_addr next_server,
         */
        if ( next_server.s_addr && filename[0] && ! uri_is_absolute ( uri ) ) {
                uri_put ( uri );
-               snprintf ( buf, sizeof ( buf ), "tftp://%s/%s";,
-                          inet_ntoa ( next_server ), filename );
+               len = snprintf ( buf, sizeof ( buf ), "tftp://%s%s";,
+                          inet_ntoa ( next_server ), ( filename[0] == '/' ) ? 
"" : "/" );
+               uri_encode( filename, buf + len, sizeof ( buf ) - len, 
URI_PATH);
                uri = parse_uri ( buf );
                if ( ! uri )
                        return NULL;
-- 
1.7.9.5

_______________________________________________
ipxe-devel mailing list
[email protected]
https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel

Reply via email to