[syslinux:pathbased] syslinux: Correctly handle the case of installing into the root

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Wed Jun 9 18:42:03 PDT 2010


Commit-ID:  b0ff6613d593ee88790a9299afd20ebd66c65b3c
Gitweb:     http://syslinux.zytor.com/commit/b0ff6613d593ee88790a9299afd20ebd66c65b3c
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Wed, 9 Jun 2010 18:38:38 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Wed, 9 Jun 2010 18:38:38 -0700

syslinux: Correctly handle the case of installing into the root

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 at linux.intel.com>


---
 core/fs/lib/loadconfig.c |    8 ++++++--
 linux/syslinux.c         |    9 +++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/core/fs/lib/loadconfig.c b/core/fs/lib/loadconfig.c
index c4876dd..356d5a2 100644
--- a/core/fs/lib/loadconfig.c
+++ b/core/fs/lib/loadconfig.c
@@ -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);
diff --git a/linux/syslinux.c b/linux/syslinux.c
index d8b3149..d6a5d83 100644
--- a/linux/syslinux.c
+++ b/linux/syslinux.c
@@ -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);



More information about the Syslinux-commits mailing list