Date: Sun, 4 May 2014 12:40:01 GMT From: Konstantin Belousov <kostikbel@gmail.com> To: freebsd-standards@FreeBSD.org Subject: Re: standards/189353: POSIX sem_unlink does not actually unlink the semaphore in the process context Message-ID: <201405041240.s44Ce0he077506@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR standards/189353; it has been noted by GNATS. From: Konstantin Belousov <kostikbel@gmail.com> To: Joris <joris@giovannangeli.fr> Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: standards/189353: POSIX sem_unlink does not actually unlink the semaphore in the process context Date: Sun, 4 May 2014 15:37:43 +0300 --X+8siUETKMkW99st Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Sun, May 04, 2014 at 11:15:23AM +0000, Joris wrote: >=20 > >Number: 189353 > >Category: standards > >Synopsis: POSIX sem_unlink does not actually unlink the semaphore = in the process context > >Confidential: no > >Severity: non-critical > >Priority: low > >Responsible: freebsd-standards > >State: open > >Quarter: =20 > >Keywords: =20 > >Date-Required: > >Class: sw-bug > >Submitter-Id: current-users > >Arrival-Date: Sun May 04 11:20:00 UTC 2014 > >Closed-Date: > >Last-Modified: > >Originator: Joris > >Release: freebsd 10 > >Organization: > >Environment: > >Description: > When a posix sempahore is open, it is cached in the process address space= =2E A call to sem_unlink does not invalidate the caching, and trying to reo= pen the semaphore with O_EXCL after calling sem_unlink fails with EEXIST. > >How-To-Repeat: > Here is a test case : >=20 > #include <fcntl.h> > #include <sys/stat.h> > #include <sys/wait.h> > #include <sys/types.h> > #include <semaphore.h> >=20 > #include <err.h> >=20 >=20 > int > main(int argc, char *argv[]) > { > sem_t *sem1, *sem2; > int error; >=20 > sem1 =3D sem_open("/test-sem1", O_CREAT | O_EXCL, S_IRWXU, 1); > if (sem1 =3D=3D SEM_FAILED) > err(1,"Cannot create test /test-sem1 semaphore"); >=20 > error =3D sem_unlink("/test-sem1"); >=20 > if (error) > err(1, "Cannot unlink semaphore /test-sem1"); >=20 >=20 > sem2 =3D sem_open("/test-sem1", O_CREAT | O_EXCL, S_IRWXU, 2); >=20 > if (sem2 =3D=3D SEM_FAILED) > err(1, "Cannot re-create semaphore /test-sem1"); >=20 > error =3D sem_unlink("/test-sem1"); >=20 > if (error) > err(1, "Cannot unlink semaphore /test-sem1"); >=20 > return(0); > } Yes, I think you are right. Please try the following patch, which worked for me, but I only lightly tested it. diff --git a/lib/libc/gen/sem_new.c b/lib/libc/gen/sem_new.c index 9a2ab27..8e4a91d 100644 --- a/lib/libc/gen/sem_new.c +++ b/lib/libc/gen/sem_new.c @@ -161,7 +161,7 @@ _sem_open(const char *name, int flags, ...) =20 _pthread_mutex_lock(&sem_llock); LIST_FOREACH(ni, &sem_list, next) { - if (strcmp(name, ni->name) =3D=3D 0) { + if (ni->name !=3D NULL && strcmp(name, ni->name) =3D=3D 0) { if ((flags & (O_CREAT|O_EXCL)) =3D=3D (O_CREAT|O_EXCL)) { _pthread_mutex_unlock(&sem_llock); errno =3D EEXIST; @@ -287,20 +287,32 @@ _sem_close(sem_t *sem) int _sem_unlink(const char *name) { + struct sem_nameinfo *ni; char path[PATH_MAX]; + int error; =20 if (name[0] !=3D '/') { errno =3D ENOENT; return -1; } name++; - strcpy(path, SEM_PREFIX); if (strlcat(path, name, sizeof(path)) >=3D sizeof(path)) { errno =3D ENAMETOOLONG; return (-1); } - return unlink(path); + + _pthread_once(&once, sem_module_init); + _pthread_mutex_lock(&sem_llock); + LIST_FOREACH(ni, &sem_list, next) { + if (ni->name !=3D NULL && strcmp(name, ni->name) =3D=3D 0) { + ni->name =3D NULL; + break; + } + } + error =3D unlink(path); + _pthread_mutex_unlock(&sem_llock); + return (error); } =20 int --X+8siUETKMkW99st Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (FreeBSD) iQIcBAEBAgAGBQJTZjSWAAoJEJDCuSvBvK1B8i0P/2MxJ9aHmhC1hsx1ktljC9mw lvb4xHSsy1JpYIRU2tafKTQyRglO9Md1jpKTTjkUbL1sakifvqZzFZv5vbJ7uEDe ST5rqLoydfrayBrMlj/2vV9pX5QV1vc40N3kjGDpwuT+Wkxbsg5bFU87b34HrxvQ jg4RDkRt7IVbv9dLGT1AUxePBoPtc+ZUF3A+UgqH7G5LZ3JA3umM35Sp9oWjv4Ot mR16WyonZ798Qk9Xcj8OGqD8DXJqamgZAlqoMbXYD8hcamqD35Ge4SRHVAb+cySV 25wgXvkB3LpGzfLLRC0EGwAjE3ZwuCAplAXPjCVfLh8wU8XZxZSNla8deUAo+xKS 7Wz4Fdhj/j6JURMvnbLc9pFyIIUTrIPWh/ZydloUjJh5k+oSHtXaVyvxxtoxxMIR Cuh6JzYwMupcMT0Pf/PKRMXGdo72KlJ5WuPkvNSotIl3jaOwJN0CsJslvD0qZr71 AxD5H6h8YDCdXdeYy3zzMI9yau+R7M84nH8cTG8xodLax26DZddRRxCZST4biLTA 8rj6tic4/xlpoEH2g54QBEW6qwm1CmtSEDlnQplJ4obLvinON69IZ8/QYLhwHhdA yQ0qiiNTtNjRWGBPGglT94fsyy4Wh0gOxLod0JegcqkasCnD0qdKnPcVySH79YyD DYFeUb3f+LZgezOI3h5N =wOWb -----END PGP SIGNATURE----- --X+8siUETKMkW99st--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405041240.s44Ce0he077506>