diff options
| author | Toomas Soome <tsoome@me.com> | 2019-05-10 12:07:50 +0300 |
|---|---|---|
| committer | Toomas Soome <tsoome@me.com> | 2019-06-18 20:40:59 +0300 |
| commit | a8412dc108558a7a3635b7ab4f3b1b743bdff9e8 (patch) | |
| tree | ca2aabacc50326b8bd82c41a33967a0532f574fd | |
| parent | 535ff4fc926c4df67c4665a72c71724810962d4f (diff) | |
| download | illumos-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.version | 2 | ||||
| -rw-r--r-- | usr/src/boot/sys/boot/common/module.c | 36 |
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) { |
