diff options
author | gonzo <gonzo@FreeBSD.org> | 2008-06-10 20:55:10 +0000 |
---|---|---|
committer | gonzo <gonzo@FreeBSD.org> | 2008-06-10 20:55:10 +0000 |
commit | 4f61d04fd875738269e8ba5c57aac378c2d5051e (patch) | |
tree | de954768519c8e44b6c4fbb9023fd0dfb06fc00f /sys/kern/uipc_sem.c | |
parent | 8f581f70eeac6e2b6a618e83e31989e411198e0d (diff) | |
download | FreeBSD-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.c | 7 |
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); } |