From owner-freebsd-bugs@FreeBSD.ORG Sun Apr 8 23:50:15 2012 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 654571065672 for ; Sun, 8 Apr 2012 23:50:15 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 4F2D08FC1F for ; Sun, 8 Apr 2012 23:50:15 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q38NoFW9074593 for ; Sun, 8 Apr 2012 23:50:15 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q38NoFqA074592; Sun, 8 Apr 2012 23:50:15 GMT (envelope-from gnats) Date: Sun, 8 Apr 2012 23:50:15 GMT Message-Id: <201204082350.q38NoFqA074592@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: David Xu Cc: Subject: Re: kern/166706: [libc] sem_open(3) incorrectly returns the already opened named semaphore handle when O_EXCL is used [regression] X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: David Xu List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Apr 2012 23:50:15 -0000 The following reply was made to PR kern/166706; it has been noted by GNATS. From: David Xu To: Jilles Tjoelker Cc: bug-followup@FreeBSD.org, davidxu@FreeBSD.org, igaztanaga@gmail.com Subject: Re: kern/166706: [libc] sem_open(3) incorrectly returns the already opened named semaphore handle when O_EXCL is used [regression] Date: Mon, 09 Apr 2012 07:49:37 +0800 On 2012/4/9 1:26, Jilles Tjoelker wrote: >> [sem_new.c may return success with O_CREAT|O_EXCL if the semaphore >> already exists] > The code in sem_new.c will happily add another reference to an already > open semaphore, even if O_CREAT|O_EXCL were specified. > > The below patch fixes this by adding an extra check. It makes the > submitter's test program pass again on head. > > What do you think? > > Index: lib/libc/gen/sem_new.c > =================================================================== > --- lib/libc/gen/sem_new.c (revision 233702) > +++ lib/libc/gen/sem_new.c (working copy) > @@ -162,10 +162,16 @@ > _pthread_mutex_lock(&sem_llock); > LIST_FOREACH(ni,&sem_list, next) { > if (strcmp(name, ni->name) == 0) { > - ni->open_count++; > - sem = ni->sem; > - _pthread_mutex_unlock(&sem_llock); > - return (sem); > + if ((flags& (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) { > + _pthread_mutex_unlock(&sem_llock); > + errno = EEXIST; > + return (SEM_FAILED); > + } else { > + ni->open_count++; > + sem = ni->sem; > + _pthread_mutex_unlock(&sem_llock); > + return (sem); > + } > } > } > The patch looks fine to me.