diff options
author | jhb <jhb@FreeBSD.org> | 2006-07-10 19:13:45 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-07-10 19:13:45 +0000 |
commit | 401a0eaea0c790a2f0ab4f8948cb5a31d823f445 (patch) | |
tree | 97b083bc9524157d6b6063118c9e472145bb7102 /sys/kern | |
parent | 0baddf7a5b7f75eb12bc070d6ca87dd54dc0be7f (diff) | |
download | FreeBSD-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.c | 9 |
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); |