summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaxim <maxim@FreeBSD.org>2006-06-15 08:53:09 +0000
committermaxim <maxim@FreeBSD.org>2006-06-15 08:53:09 +0000
commitcd982b5207bedb326e25ab56cd0030918cedb6c2 (patch)
tree62d29f4b2f9ae1b9174785a841dea097fa319886
parent9755dcd8dbe6b583601673fe7095f34cd82a7e53 (diff)
downloadFreeBSD-src-cd982b5207bedb326e25ab56cd0030918cedb6c2.zip
FreeBSD-src-cd982b5207bedb326e25ab56cd0030918cedb6c2.tar.gz
o Expand an exclusive lock scope to prevent a race between two
simultaneous module_register(). Original work done by: Alex Lyashkov Reviewed by: jhb MFC after: 2 weeks
-rw-r--r--sys/kern/kern_module.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c
index f92d39c..9731717 100644
--- a/sys/kern/kern_module.c
+++ b/sys/kern/kern_module.c
@@ -136,20 +136,20 @@ module_register(const moduledata_t *data, linker_file_t container)
size_t namelen;
module_t newmod;
- MOD_SLOCK;
+ MOD_XLOCK;
newmod = module_lookupbyname(data->name);
if (newmod != NULL) {
- MOD_SUNLOCK;
+ MOD_XUNLOCK;
printf("module_register: module %s already exists!\n",
data->name);
return (EEXIST);
}
- MOD_SUNLOCK;
namelen = strlen(data->name) + 1;
newmod = malloc(sizeof(struct module) + namelen, M_MODULE, M_WAITOK);
- if (newmod == NULL)
+ if (newmod == NULL) {
+ MOD_XUNLOCK;
return (ENOMEM);
- MOD_XLOCK;
+ }
newmod->refs = 1;
newmod->id = nextid++;
newmod->name = (char *)(newmod + 1);
OpenPOWER on IntegriCloud