diff options
| author | Toomas Soome <tsoome@me.com> | 2019-05-10 14:44:26 +0300 |
|---|---|---|
| committer | Toomas Soome <tsoome@me.com> | 2019-05-16 21:40:46 +0300 |
| commit | 08e3b8cf1f1ed2d597092d1de9fa46c7e2947d98 (patch) | |
| tree | 293f80066bc98caa3b9b932bb6c1cb73d9ec6606 | |
| parent | 3eb8c55c1d853cead5cb89c78b077de199f0fb6a (diff) | |
| download | illumos-joyent-08e3b8cf1f1ed2d597092d1de9fa46c7e2947d98.tar.gz | |
10947 loader: memory related issues in module.c
Reviewed by: Gergő Doma <domag02@gmail.com>
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 | 76 |
2 files changed, 46 insertions, 32 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version index f7eca4e400..d3fafb7152 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.09.1 +BOOT_VERSION = $(LOADER_VERSION)-2019.05.14.1 diff --git a/usr/src/boot/sys/boot/common/module.c b/usr/src/boot/sys/boot/common/module.c index 445d039144..cc254b6ed6 100644 --- a/usr/src/boot/sys/boot/common/module.c +++ b/usr/src/boot/sys/boot/common/module.c @@ -502,8 +502,7 @@ build_environment_module(void) if (fp == NULL || fp->f_name == NULL || fp->f_type == NULL) { printf("Can not load environment module: %s\n", "out of memory"); - if (fp != NULL) - file_discard(fp); + file_discard(fp); return; } @@ -594,8 +593,7 @@ build_font_module(void) if (fp == NULL || fp->f_name == NULL || fp->f_type == NULL) { printf("Can not load font module: %s\n", "out of memory"); - if (fp != NULL) - file_discard(fp); + file_discard(fp); return; } @@ -709,7 +707,17 @@ file_loadraw(const char *fname, char *type, int argc, char **argv, int insert) /* Looks OK so far; create & populate control structure */ fp = file_alloc(); - fp->f_name = strdup(name); + if (fp == NULL) { + if (archsw.arch_free_loadaddr != NULL) + archsw.arch_free_loadaddr(loadaddr, + (uint64_t)(roundup2(st.st_size, PAGE_SIZE) >> 12)); + snprintf(command_errbuf, sizeof (command_errbuf), + "no memory to load %s", name); + free(name); + close(fd); + return (NULL); + } + fp->f_name = name; fp->f_args = unargv(argc, argv); fp->f_type = strdup(type); fp->f_metadata = NULL; @@ -717,6 +725,14 @@ file_loadraw(const char *fname, char *type, int argc, char **argv, int insert) fp->f_addr = loadaddr; fp->f_size = laddr - loadaddr; + if (fp->f_type == NULL || + (argc != 0 && fp->f_args == NULL)) { + close(fd); + snprintf(command_errbuf, sizeof (command_errbuf), + "no memory to load %s", name); + file_discard(fp); + return (NULL); + } /* recognise space consumption */ loadaddr = laddr; @@ -746,8 +762,7 @@ mod_load(char *modname, struct mod_depend *verinfo, int argc, char *argv[]) /* see if module is already loaded */ mp = file_findmodule(NULL, modname, verinfo); if (mp) { - if (mp->m_args) - free(mp->m_args); + free(mp->m_args); mp->m_args = unargv(argc, argv); snprintf(command_errbuf, sizeof (command_errbuf), "warning: module '%s' already loaded", mp->m_name); @@ -761,6 +776,7 @@ mod_load(char *modname, struct mod_depend *verinfo, int argc, char *argv[]) return (ENOENT); } err = mod_loadkld(filename, argc, argv); + free(filename); return (err); } @@ -818,7 +834,7 @@ mod_loadkld(const char *kldname, int argc, char *argv[]) snprintf(command_errbuf, sizeof (command_errbuf), "don't know how to load module '%s'", filename); } - if (err && fp) + if (err) file_discard(fp); free(filename); return (err); @@ -886,14 +902,17 @@ file_findmodule(struct preloaded_file *fp, char *modname, void file_addmetadata(struct preloaded_file *fp, int type, size_t size, void *p) { - struct file_metadata *md; - - md = malloc(sizeof(struct file_metadata) - sizeof(md->md_data) + size); - md->md_size = size; - md->md_type = type; - bcopy(p, md->md_data, size); - md->md_next = fp->f_metadata; - fp->f_metadata = md; + struct file_metadata *md; + + md = malloc(sizeof (struct file_metadata) - sizeof (md->md_data) + + size); + if (md != NULL) { + md->md_size = size; + md->md_type = type; + bcopy(p, md->md_data, size); + md->md_next = fp->f_metadata; + } + fp->f_metadata = md; } /* @@ -1121,11 +1140,14 @@ file_addmodule(struct preloaded_file *fp, char *modname, int version, mp = file_findmodule(fp, modname, &mdepend); if (mp) return (EEXIST); - mp = malloc(sizeof(struct kernel_module)); + mp = calloc(1, sizeof(struct kernel_module)); if (mp == NULL) return (ENOMEM); - bzero(mp, sizeof(struct kernel_module)); mp->m_name = strdup(modname); + if (mp->m_name == NULL) { + free(mp); + return (ENOMEM); + } mp->m_version = version; mp->m_fp = fp; mp->m_next = fp->f_modules; @@ -1158,8 +1180,7 @@ file_discard(struct preloaded_file *fp) } mp = fp->f_modules; while (mp) { - if (mp->m_name) - free(mp->m_name); + free(mp->m_name); mp1 = mp; mp = mp->m_next; free(mp1); @@ -1177,12 +1198,8 @@ file_discard(struct preloaded_file *fp) struct preloaded_file * file_alloc(void) { - struct preloaded_file *fp; - if ((fp = malloc(sizeof(struct preloaded_file))) != NULL) { - bzero(fp, sizeof(struct preloaded_file)); - } - return (fp); + return (calloc(1, sizeof (struct preloaded_file))); } /* @@ -1253,10 +1270,8 @@ moduledir_readhints(struct moduledir *mdp) return; bad: close(fd); - if (mdp->d_hints) { - free(mdp->d_hints); - mdp->d_hints = NULL; - } + free(mdp->d_hints); + mdp->d_hints = NULL; mdp->d_flags |= MDIR_NOHINTS; return; } @@ -1317,8 +1332,7 @@ moduledir_rebuild(void) if ((mdp->d_flags & MDIR_REMOVED) == 0) { mdp = STAILQ_NEXT(mdp, d_link); } else { - if (mdp->d_hints) - free(mdp->d_hints); + free(mdp->d_hints); mtmp = mdp; mdp = STAILQ_NEXT(mdp, d_link); STAILQ_REMOVE(&moduledir_list, mtmp, moduledir, d_link); |
