loader: fix memory handling errors in module.c

file_loadraw():
check for file_alloc() and strdup() results.
we leak 'name'.

mod_load() does leak 'filename'.

mod_loadkld() does not need to check fp, file_discard() does check.
This commit is contained in:
Toomas Soome 2019-05-13 22:17:11 +00:00
parent 82d7bf6b1b
commit b17868a211

View File

@ -499,7 +499,14 @@ file_loadraw(const char *fname, char *type, int insert)
/* Looks OK so far; create & populate control structure */ /* Looks OK so far; create & populate control structure */
fp = file_alloc(); fp = file_alloc();
fp->f_name = strdup(name); if (fp == NULL) {
snprintf(command_errbuf, sizeof (command_errbuf),
"no memory to load %s", name);
free(name);
close(fd);
return (NULL);
}
fp->f_name = name;
fp->f_type = strdup(type); fp->f_type = strdup(type);
fp->f_args = NULL; fp->f_args = NULL;
fp->f_metadata = NULL; fp->f_metadata = NULL;
@ -507,6 +514,13 @@ file_loadraw(const char *fname, char *type, int insert)
fp->f_addr = loadaddr; fp->f_addr = loadaddr;
fp->f_size = laddr - loadaddr; fp->f_size = laddr - loadaddr;
if (fp->f_type == NULL) {
snprintf(command_errbuf, sizeof (command_errbuf),
"no memory to load %s", name);
free(name);
close(fd);
return (NULL);
}
/* recognise space consumption */ /* recognise space consumption */
loadaddr = laddr; loadaddr = laddr;
@ -552,6 +566,7 @@ mod_load(char *modname, struct mod_depend *verinfo, int argc, char *argv[])
return (ENOENT); return (ENOENT);
} }
err = mod_loadkld(filename, argc, argv); err = mod_loadkld(filename, argc, argv);
free(filename);
return (err); return (err);
} }
@ -607,7 +622,7 @@ mod_loadkld(const char *kldname, int argc, char *argv[])
snprintf(command_errbuf, sizeof(command_errbuf), snprintf(command_errbuf, sizeof(command_errbuf),
"don't know how to load module '%s'", filename); "don't know how to load module '%s'", filename);
} }
if (err && fp) if (err)
file_discard(fp); file_discard(fp);
free(filename); free(filename);
return (err); return (err);