Re: sem_init: pshared=0 difference between Linux and NetBSD

Valery Ushakov <[email protected]>
Newsgroups gmane.os.netbsd.current
Message-ID <[email protected]>
On Tue, Feb 03, 2026 at 07:05:44 -0500, Greg Troxel wrote:

> As the bumper sticker says: What Would Posix Say?
> 
>   https://pubs.opengroup.org/onlinepubs/9799919799/functions/sem_init.html
> 
>     The sem_init() function shall initialize the unnamed semaphore
>     referred to by sem. The value of the initialized semaphore shall be
>     value. Following a successful call to sem_init(), the semaphore can be
>     used in subsequent calls to sem_clockwait(), sem_destroy(),
>     sem_post(), sem_timedwait(), sem_trywait(), and sem_wait(). This
>     semaphore shall remain usable until the semaphore is destroyed. An
>     unnamed semaphore may be implemented using a file descriptor.
> 
>     If the pshared argument has a non-zero value, then the semaphore is
>     shared between processes; in this case, any process that can access
>     the semaphore sem can use sem for performing sem_clockwait(),
>     sem_destroy(), sem_post(), sem_timedwait(), sem_trywait(), and
>     sem_wait() operations.
> 
>     If the pshared argument is zero, then the semaphore is shared between
>     threads of the process; any thread in this process can use sem for
>     performing sem_clockwait(), sem_destroy(), sem_post(),
>     sem_timedwait(), sem_trywait(), and sem_wait() operations.
> 
> That text doesn't strictly say that with pshared=0 that cross-process
> accesses are blocked, but I'd say it is implied strongly enough to be
> the only reasonable interpretation, to the point that I'd expect Austin
> Group to reject a clarification as unnecessary.  I see "is shared
> between the threads of a process" to exclude other sharing.
> 
> I think the NetBSD behavior is a bug.

Well, it would be nice to get a standalone test case to begin with.
The fix at that URL changes the internals of spawn reimplementation
inside libgpg-error, which gpg presumably relies upon.

But if we are into exgetics, I'd note that posix text makes a
distinction.  Shared as a property of a semaphore, and the fact that a
process can access it are not the same.  To summarize the relevant
paragraph:

  1: the [shared] semaphore is shared between processes;
  2: in this case, any process that can access the semaphore sem
  3: can use sem for performing sem_*() operations.

A process can access a semaphore sem (2) that is _not_ shared (1,
negated), but in that case it can _not_ (3, negated) use the semaphore
operations.

The fix in libgpg-error moves around the time the post-syscall hook is
called and I suspect gpg was (indirectly, b/c its hook was called at
the wrong time) doing something like the above, i.e. "using
operations" on a semaphore that it "has access to", but that is not
really shared.

-uwe
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.