| 552 | } |
| 553 | |
| 554 | static void |
| 555 | sem_remove(int semidx, struct ucred *cred) |
| 556 | { |
| 557 | struct semid_kernel *semakptr; |
| 558 | int i; |
| 559 | |
| 560 | KASSERT(semidx >= 0 && semidx < seminfo.semmni, |
| 561 | ("semidx out of bounds")); |
| 562 | mtx_assert(&sem_mtx, MA_OWNED); |
| 563 | semakptr = &sema[semidx]; |
| 564 | KASSERT(semakptr->u.__sem_base - sem + semakptr->u.sem_nsems <= semtot, |
| 565 | ("sem_remove: sema %d corrupted sem pointer %p %p %d %d", |
| 566 | semidx, semakptr->u.__sem_base, sem, semakptr->u.sem_nsems, |
| 567 | semtot)); |
| 568 | |
| 569 | semakptr->u.sem_perm.cuid = cred ? cred->cr_uid : 0; |
| 570 | semakptr->u.sem_perm.uid = cred ? cred->cr_uid : 0; |
| 571 | semakptr->u.sem_perm.mode = 0; |
| 572 | racct_sub_cred(semakptr->cred, RACCT_NSEM, semakptr->u.sem_nsems); |
| 573 | crfree(semakptr->cred); |
| 574 | semakptr->cred = NULL; |
| 575 | SEMUNDO_LOCK(); |
| 576 | semundo_clear(semidx, -1); |
| 577 | SEMUNDO_UNLOCK(); |
| 578 | #ifdef MAC |
| 579 | mac_sysvsem_cleanup(semakptr); |
| 580 | #endif |
| 581 | wakeup(semakptr); |
| 582 | for (i = 0; i < seminfo.semmni; i++) { |
| 583 | if ((sema[i].u.sem_perm.mode & SEM_ALLOC) && |
| 584 | sema[i].u.__sem_base > semakptr->u.__sem_base) |
| 585 | mtx_lock_flags(&sema_mtx[i], LOP_DUPOK); |
| 586 | } |
| 587 | for (i = semakptr->u.__sem_base - sem + semakptr->u.sem_nsems; |
| 588 | i < semtot; i++) |
| 589 | sem[i - semakptr->u.sem_nsems] = sem[i]; |
| 590 | for (i = 0; i < seminfo.semmni; i++) { |
| 591 | if ((sema[i].u.sem_perm.mode & SEM_ALLOC) && |
| 592 | sema[i].u.__sem_base > semakptr->u.__sem_base) { |
| 593 | sema[i].u.__sem_base -= semakptr->u.sem_nsems; |
| 594 | mtx_unlock(&sema_mtx[i]); |
| 595 | } |
| 596 | } |
| 597 | semtot -= semakptr->u.sem_nsems; |
| 598 | } |
| 599 | |
| 600 | static struct prison * |
| 601 | sem_find_prison(struct ucred *cred) |
no test coverage detected