summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2019-05-10 12:07:50 +0300
committerToomas Soome <tsoome@me.com>2019-06-18 20:40:59 +0300
commita8412dc108558a7a3635b7ab4f3b1b743bdff9e8 (patch)
treeca2aabacc50326b8bd82c41a33967a0532f574fd
parent535ff4fc926c4df67c4665a72c71724810962d4f (diff)
downloadillumos-joyent-a8412dc108558a7a3635b7ab4f3b1b743bdff9e8.tar.gz
11074 loader: mod_loadkld() error: we previously assumed 'last_file' could be null
Reviewed by: John Levon <john.levon@joyent.com> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/boot/Makefile.version2
-rw-r--r--usr/src/boot/sys/boot/common/module.c36
2 files changed, 30 insertions, 8 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version
index 5febd80a06..ff8cecbbf6 100644
--- a/usr/src/boot/Makefile.version
+++ b/usr/src/boot/Makefile.version
@@ -33,4 +33,4 @@ LOADER_VERSION = 1.1
# Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes.
# The version is processed from left to right, the version number can only
# be increased.
-BOOT_VERSION = $(LOADER_VERSION)-2019.05.17.1
+BOOT_VERSION = $(LOADER_VERSION)-2019.05.29.1
diff --git a/usr/src/boot/sys/boot/common/module.c b/usr/src/boot/sys/boot/common/module.c
index ab16b6b8a4..ca4090fc24 100644
--- a/usr/src/boot/sys/boot/common/module.c
+++ b/usr/src/boot/sys/boot/common/module.c
@@ -68,6 +68,7 @@ static struct kernel_module *file_findmodule(struct preloaded_file *, char *,
static int file_havepath(const char *);
static char *mod_searchmodule(char *, struct mod_depend *);
static void file_insert_tail(struct preloaded_file *);
+static void file_remove(struct preloaded_file *);
struct file_metadata *metadata_next(struct file_metadata *, int);
static void moduledir_readhints(struct moduledir *);
static void moduledir_rebuild(void);
@@ -763,9 +764,10 @@ mod_load(char *modname, struct mod_depend *verinfo, int argc, char *argv[])
int
mod_loadkld(const char *kldname, int argc, char *argv[])
{
- struct preloaded_file *fp, *last_file;
+ struct preloaded_file *fp;
int err;
char *filename;
+ vm_offset_t loadaddr_saved;
/*
* Get fully qualified KLD name
@@ -786,22 +788,19 @@ mod_loadkld(const char *kldname, int argc, char *argv[])
free(filename);
return (0);
}
- for (last_file = preloaded_files;
- last_file != NULL && last_file->f_next != NULL;
- last_file = last_file->f_next)
- ;
do {
err = file_load(filename, loadaddr, &fp);
if (err)
break;
fp->f_args = unargv(argc, argv);
+ loadaddr_saved = loadaddr;
loadaddr = fp->f_addr + fp->f_size;
file_insert_tail(fp); /* Add to the list of loaded files */
if (file_load_dependencies(fp) != 0) {
err = ENOENT;
- last_file->f_next = NULL;
- loadaddr = last_file->f_addr + last_file->f_size;
+ file_remove(fp);
+ loadaddr = loadaddr_saved;
fp = NULL;
break;
}
@@ -1205,6 +1204,29 @@ file_insert_tail(struct preloaded_file *fp)
}
}
+/*
+ * Remove module from the chain
+ */
+static void
+file_remove(struct preloaded_file *fp)
+{
+ struct preloaded_file *cm;
+
+ if (preloaded_files == NULL)
+ return;
+
+ if (preloaded_files == fp) {
+ preloaded_files = fp->f_next;
+ return;
+ }
+ for (cm = preloaded_files; cm->f_next != NULL; cm = cm->f_next) {
+ if (cm->f_next == fp) {
+ cm->f_next = fp->f_next;
+ return;
+ }
+ }
+}
+
static char *
moduledir_fullpath(struct moduledir *mdp, const char *fname)
{