The following reply was made to PR kern/166706; it has been noted by GNATS.

From: Jilles Tjoelker <[email protected]>
To: [email protected], [email protected]
Cc: [email protected]
Subject: Re: kern/166706: [libc] sem_open(3) incorrectly returns the already
 opened named semaphore handle when O_EXCL is used [regression]
Date: Sun, 8 Apr 2012 19:26:39 +0200

 > [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);
 +                      }
                }
        }
  
 
 -- 
 Jilles Tjoelker
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to