From nobody@FreeBSD.org  Tue Mar 16 11:11:54 2004
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 155CC16A4CE
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 16 Mar 2004 11:11:54 -0800 (PST)
Received: from www.freebsd.org (www.freebsd.org [216.136.204.117])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 0EF8543D31
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 16 Mar 2004 11:11:54 -0800 (PST)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.12.10/8.12.10) with ESMTP id i2GJBr72036808
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 16 Mar 2004 11:11:53 -0800 (PST)
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.12.10/8.12.10/Submit) id i2GJBr67036807;
	Tue, 16 Mar 2004 11:11:53 -0800 (PST)
	(envelope-from nobody)
Message-Id: <200403161911.i2GJBr67036807@www.freebsd.org>
Date: Tue, 16 Mar 2004 11:11:53 -0800 (PST)
From: "Ramy M. Hassan" <ramy@gawab.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Bug in sysv semaphore waiting processes count
X-Send-Pr-Version: www-2.3

>Number:         64347
>Category:       misc
>Synopsis:       Bug in sysv semaphore waiting processes count
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    cperciva
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar 16 11:20:08 PST 2004
>Closed-Date:    Wed Mar 24 03:42:01 PST 2004
>Last-Modified:  Wed Mar 24 03:42:01 PST 2004
>Originator:     Ramy M. Hassan
>Release:        4.9RELEASE
>Organization:
AAST
>Environment:
FreeBSD GawabSRV01.Gawab.com 4.9-RELEASE-p2 FreeBSD 4.9-RELEASE-p2 #0: Tue Mar  2 03:21:19 EET 2004     root@GawabSRV01.Gawab.com:/usr/obj/usr/src/sys/GAWABMAINSMPWFC  i386
>Description:
When a procss is waiting for a semaphore value to be more than zero ( calling semop ) , then receives a signal, the semop() returns -1 and errno is set to EINTR. This is fine, but the problem is that the number of processes waiting for the semaphore is not decremented. So a successive call to semctl(semsetid,semid,GETNCNT,0) will return an incorrect value.
>How-To-Repeat:
Write a program that intializes a semaphore set to zero , then call semop in a loop 

struct sembuf oplist[] = { { 0 , -1 , 0 } };
while ( semop(semid,oplist,1) < 0 ) {
printf("Number of waiting processes %d \n",semctl(semid,prof,GETNCNT));
}

while the process is waiting on the semaphore , send the process any signal that the process can handle. You will see that the number of waiting processes will increment each time a signal is sent which is incorrect.

>Fix:
      
>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->cperciva 
Responsible-Changed-By: cperciva 
Responsible-Changed-When: Tue Mar 16 20:22:22 PST 2004 
Responsible-Changed-Why:  
I think I know how to fix this. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64347 
State-Changed-From-To: open->patched 
State-Changed-By: cperciva 
State-Changed-When: Wed Mar 17 01:38:04 PST 2004 
State-Changed-Why:  
Fixed in current, will MFC in 7 days. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64347 
State-Changed-From-To: patched->closed 
State-Changed-By: cperciva 
State-Changed-When: Wed Mar 24 03:41:40 PST 2004 
State-Changed-Why:  
MFC done 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64347 
>Unformatted:
