]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[autoboot] Use next-server from filename's settings block
authorMichael Brown <mcb30@ipxe.org>
Mon, 24 Jun 2013 15:14:36 +0000 (16:14 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 24 Jun 2013 15:14:36 +0000 (16:14 +0100)
Locate the settings block containing the filename, and search only
that settings block for the next-server address.  This avoids problems
caused by misconfigured DHCP servers which provide a next-server
address (often defaulting to the DHCP server's own IP address) even
when not providing a filename.

Originally-implemented-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/usr/autoboot.c

index b2d288eade759162b6f827dc12b2ea04f09bba21..70f883a598fbc4c41508e4a21366daa2f79523aa 100644 (file)
@@ -251,31 +251,42 @@ static void close_all_netdevs ( void ) {
  * @ret uri            URI, or NULL on failure
  */
 struct uri * fetch_next_server_and_filename ( struct settings *settings ) {
-       struct in_addr next_server;
-       char buf[256];
+       struct in_addr next_server = { 0 };
+       char *raw_filename = NULL;
+       struct uri *uri = NULL;
        char *filename;
-       struct uri *uri;
 
-       /* Fetch next-server setting */
-       fetch_ipv4_setting ( settings, &next_server_setting, &next_server );
-       if ( next_server.s_addr )
-               printf ( "Next server: %s\n", inet_ntoa ( next_server ) );
+       /* Determine settings block containing the filename, if any */
+       settings = fetch_setting_origin ( settings, &filename_setting );
 
-       /* Fetch filename setting */
-       fetch_string_setting ( settings, &filename_setting,
-                              buf, sizeof ( buf ) );
-       if ( buf[0] )
-               printf ( "Filename: %s\n", buf );
+       /* If we have a filename, fetch it along with next-server */
+       if ( settings ) {
+               fetch_ipv4_setting ( settings, &next_server_setting,
+                                    &next_server );
+               if ( fetch_string_setting_copy ( settings, &filename_setting,
+                                                &raw_filename ) < 0 )
+                       goto err_fetch;
+       }
 
        /* Expand filename setting */
-       filename = expand_settings ( buf );
+       filename = expand_settings ( raw_filename ? raw_filename : "" );
        if ( ! filename )
-               return NULL;
+               goto err_expand;
 
        /* Parse next server and filename */
+       if ( next_server.s_addr )
+               printf ( "Next server: %s\n", inet_ntoa ( next_server ) );
+       if ( filename[0] )
+               printf ( "Filename: %s\n", filename );
        uri = parse_next_server_and_filename ( next_server, filename );
+       if ( ! uri )
+               goto err_parse;
 
+ err_parse:
        free ( filename );
+ err_expand:
+       free ( raw_filename );
+ err_fetch:
        return uri;
 }