summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_sem.c
diff options
context:
space:
mode:
authorgonzo <gonzo@FreeBSD.org>2008-06-10 20:55:10 +0000
committergonzo <gonzo@FreeBSD.org>2008-06-10 20:55:10 +0000
commit4f61d04fd875738269e8ba5c57aac378c2d5051e (patch)
treede954768519c8e44b6c4fbb9023fd0dfb06fc00f /sys/kern/uipc_sem.c
parent8f581f70eeac6e2b6a618e83e31989e411198e0d (diff)
downloadFreeBSD-src-4f61d04fd875738269e8ba5c57aac378c2d5051e.zip
FreeBSD-src-4f61d04fd875738269e8ba5c57aac378c2d5051e.tar.gz
Keep proper track of nsegs counter: sem_free is called for all
allocated semaphores, so it's wrong to increase it conditionally, in this case for every over-the-limit semaphore nsegs is decreased without being previously increased. PR: kern/123685 Approved by: cognet (mentor)
Diffstat (limited to 'sys/kern/uipc_sem.c')
-rw-r--r--sys/kern/uipc_sem.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index c040613..a91096f 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -221,14 +221,13 @@ sem_create(struct thread *td, const char *name, struct ksem **ksret,
sem_enter(td->td_proc, ret);
*ksret = ret;
mtx_lock(&sem_lock);
- if (nsems >= p31b_getcfg(CTL_P1003_1B_SEM_NSEMS_MAX)) {
+ nsems++;
+ if (nsems > p31b_getcfg(CTL_P1003_1B_SEM_NSEMS_MAX)) {
sem_leave(td->td_proc, ret);
sem_free(ret);
error = ENFILE;
- } else {
- nsems++;
+ } else
error = 0;
- }
mtx_unlock(&sem_lock);
return (error);
}
OpenPOWER on IntegriCloud