Date: Sun, 8 Apr 2012 23:50:15 GMT From: David Xu <listlog2011@gmail.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/166706: [libc] sem_open(3) incorrectly returns the already opened named semaphore handle when O_EXCL is used [regression] Message-ID: <201204082350.q38NoFqA074592@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/166706; it has been noted by GNATS.
From: David Xu <listlog2011@gmail.com>
To: Jilles Tjoelker <jilles@stack.nl>
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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204082350.q38NoFqA074592>
