summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-07-10 19:13:45 +0000
committerjhb <jhb@FreeBSD.org>2006-07-10 19:13:45 +0000
commit401a0eaea0c790a2f0ab4f8948cb5a31d823f445 (patch)
tree97b083bc9524157d6b6063118c9e472145bb7102 /sys/kern
parent0baddf7a5b7f75eb12bc070d6ca87dd54dc0be7f (diff)
downloadFreeBSD-src-401a0eaea0c790a2f0ab4f8948cb5a31d823f445.zip
FreeBSD-src-401a0eaea0c790a2f0ab4f8948cb5a31d823f445.tar.gz
Fix two more instances of using a linker_file_t object in TAILQ() macros
after free'ing it. Found by: Coverity Prevent(tm) CID: 1435
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_linker.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index 0aeb21c..55ad60e 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -1274,7 +1274,7 @@ linker_preload(void *arg)
caddr_t modptr;
const char *modname, *nmodname;
char *modtype;
- linker_file_t lf;
+ linker_file_t lf, nlf;
linker_class_t lc;
int error;
linker_file_list_t loaded_files;
@@ -1384,10 +1384,10 @@ restart:
nver) != NULL) {
printf("module %s already"
" present!\n", modname);
- linker_file_unload(lf,
- LINKER_UNLOAD_FORCE);
TAILQ_REMOVE(&loaded_files,
lf, loaded);
+ linker_file_unload(lf,
+ LINKER_UNLOAD_FORCE);
/* we changed tailq next ptr */
goto restart;
}
@@ -1418,7 +1418,7 @@ restart:
/*
* We made it. Finish off the linking in the order we determined.
*/
- TAILQ_FOREACH(lf, &depended_files, loaded) {
+ TAILQ_FOREACH_SAFE(lf, &depended_files, loaded, nlf) {
if (linker_kernel_file) {
linker_kernel_file->refs++;
error = linker_file_add_dependency(lf,
@@ -1453,6 +1453,7 @@ restart:
*/
error = LINKER_LINK_PRELOAD_FINISH(lf);
if (error) {
+ TAILQ_REMOVE(&depended_files, lf, loaded);
printf("KLD file %s - could not finalize loading\n",
lf->filename);
linker_file_unload(lf, LINKER_UNLOAD_FORCE);
OpenPOWER on IntegriCloud