syslinux: Correctly handle the case of installing into the root
authorH. Peter Anvin <hpa@linux.intel.com>
Thu, 10 Jun 2010 01:38:38 +0000 (18:38 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Thu, 10 Jun 2010 01:38:38 +0000 (18:38 -0700)
When installing into the root directory, we should logically search
the root directory first.  Thus, we need to make sure the current path
is "/" not "".

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
core/fs/lib/loadconfig.c
linux/syslinux.c

index c4876dd..356d5a2 100644 (file)
@@ -30,11 +30,15 @@ int generic_load_config(void)
 
     search_directories[0] = CurrentDirName;
 
+    dprintf("CurrentDirName: \"%s\"\n", CurrentDirName);
+
     for (i = *CurrentDirName ? 0 : 1; search_directories[i]; i++) {
+       const char *sd = search_directories[i];
        for (j = 0; filenames[j]; j++) {
            memset(&regs, 0, sizeof regs);
-           snprintf(ConfigName, FILENAME_MAX, "%s/%s",
-                    search_directories[i], filenames[j]);
+           snprintf(ConfigName, FILENAME_MAX, "%s%s%s",
+                    sd, (*sd && sd[strlen(sd)-1] == '/') ? "" : "/",
+                    filenames[j]);
            regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
            dprintf("Config search: %s\n", ConfigName);
            call16(core_open, &regs, &regs);
index d8b3149..d6a5d83 100644 (file)
@@ -276,7 +276,7 @@ int main(int argc, char *argv[])
     char mntname[128];
     char *ldlinux_name;
     char *ldlinux_path;
-    const char *subdir;
+    char *subdir;
     uint32_t *sectors = NULL;
     int ldlinux_sectors = (boot_image_len + SECTOR_SIZE - 1) >> SECTOR_SHIFT;
     const char *errmsg;
@@ -288,7 +288,12 @@ int main(int argc, char *argv[])
     umask(077);
     parse_options(argc, argv, MODE_SYSLINUX);
 
-    subdir = opt.directory;
+    asprintf(&subdir, "%s%s",
+            opt.directory[0] == '/' ? "" : "/", opt.directory);
+    if (!subdir) {
+       perror(program);
+       exit(1);
+    }
 
     if (!opt.device)
        usage(EX_USAGE, MODE_SYSLINUX);