Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3a448a87-4bcb-4c1c-bf78-b3c3d7ee4a29@koorogi.info>
Date: Sun, 8 Jun 2025 13:39:17 -0500
From: Bobby Bingham <koorogi@...rogi.info>
To: musl@...ts.openwall.com
Subject: Re: The `sigpause` function behavior does not fully comply
 with the POSIX specification

On 6/8/25 12:09, Rich Felker wrote:
>>>
>>> See https://pubs.opengroup.org/onlinepubs/9699919799/functions/
>>> sigpause.html for POSIX.1-2018
>>> where EINVAL is allowed and sigpause returns SIG_ERR (defined by musl in
>>> <signal.h> to ((void (*)(int))-1) ).
>>
>> That page says:
>>
>>      The sigpause() function shall suspend execution of the thread until
>>      a signal is received, whereupon it shall return -1 and set errno to
>>      [EINTR].
>>
>> This reads to me that sigpause is only permitted to set errno to EINTR, and
>> not to return other errors. The list of errors would seem to apply to the
>> other functions on the page, which are documented to "use errno to indicate
>> the error."
> 
> That's specifying the behavior on successful return, not on errors.

Quoting the entire RETURN VALUE section:


     Upon successful completion, sigset() shall return SIG_HOLD if the
     signal had been blocked and the signal's previous disposition if it
     had not been blocked. Otherwise, SIG_ERR shall be returned and errno
     set to indicate the error.

     The sigpause() function shall suspend execution of the thread until
     a signal is received, whereupon it shall return -1 and set errno to
     [EINTR].

     For all other functions, upon successful completion, 0 shall be
     returned. Otherwise, -1 shall be returned and errno set to indicate
     the error.


For all the other functions, the documentation clearly distinguishes 
between successful completion and errors, and states what return value 
indicates that an error occurred.  For sigpause, it does not.  As you 
stated, the documentation here specifies what happens on success -- 
there is no mention of what the return value is on failure.

I took this to mean that sigpause cannot report errors, and therefore 
cannot fail.


> 
> The ERRORS section says:
> 
>      These functions shall fail if:
> 
>      [EINVAL]
>          The sig argument is an illegal signal number.
> 
> Seems pretty clear. This is a "shall fail" (mandatory) not a "may
> fail", so detecting the invalid signal number and failing with EINVAL
> is mandatory. The old behavior of ignoring it was non-conforming.


I did read that.  I found it hard to reconcile a "shall fail" error for 
a function that does not have a documented way to report errors, so 
thought perhaps the phrasing "these functions" was intended to refer to 
just those functions on the page _that can report errors_.

One can certainly read between the lines and infer that a return value 
of -1 can indicate an error.  I just expected it to explicitly say so if 
that was the case.  But I'm not an expert at reading the POSIX spec; 
perhaps my expectation is wrong.  Or perhaps the wording for this 
function was just unusually sloppy.


> 
> See: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigpause.html
> 
> Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.