DragonFlyBSD Kernel Audit
DF-2785 / fix.diff
← back to finding ↓ download raw
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1002,8 +1002,19 @@
 				if (adjval == 0)
 					continue;
 				if (semundo_adjust(td->td_proc, semid,
-					       sops[j].sem_num, adjval) != 0)
-					panic("semop - can't undo undos");
+					       sops[j].sem_num, adjval) != 0) {
+					/*
+					 * Only possible when a sibling
+					 * thread of this process raced
+					 * our undo vector.  Do not take
+					 * the system down for it; leave
+					 * the accounting as-is.
+					 */
+					kprintf("semop: SEM_UNDO rollback "
+						"lost a race, pid %d\n",
+						td->td_proc->p_pid);
+					break;
+				}
 			}
 
 			for (j = 0; j < nsops; j++) {