Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Sun, 5 Feb 2017 17:04:43 -0600
From: "A. Wilcox" <>
Subject: The Great Big POSIX Conformance Thread [phase 1]

Hello fellow muslers,

I have been reading through the source tree of musl for two reasons.
One is to familiarise myself with the codebase more so that I can be
of better use if/when patches need to be written.  The other is doing
a cursory audit of POSIX conformance per XSH 2008 (2016 ed.); we at
Adélie are in the beginning stages of acquiring a license to the
VSX-PCTS2016 test suite (which would be phase 2) and I thought it'd be
prudent to find any obvious errors before obtaining it.

I have found some non-conformant functions through my audit.  Four are
(hopefully) easy to fix; two require more thought; and one will likely
need to be discussed.

Easy fixes


This function is not implemented, and always fails.  This is [barely]
legal in POSIX, but the failure must set errno.  None of the errors
are very appropriate (unfortunately ENOSYS is invalid); maybe ENOMEM
will work.


Non-conformance of this function was discussed on IRC.  Rich Felker
had said he would apply the patch I wrote[1], but it has not been
applied yet.  If there is an issue with said patch, please let me know
so that I may fix it.



This function always sets errno to ENOBUFS, even when the function
completes succesfully.  A full test case is available[2], and a
suggested patch is also available[3].



This function does not provide a reference for timestamp resolution.
See the POSIX reference[4] for more information.  This should be easy
to fix.


Further thought required


musl returns the empty string ("") for options where it does not have
any values.  The POSIX standard states[5] that if an option is
recognised but does not have a value, errno should not be set and NULL
should be returned.



musl simply returns getenv("LOGNAME").  getlogin(3) is used to
determine the login name of the controlling terminal for the process.
 In addition to getenv("LOGNAME") being improper behaviour (since
getlogin(3) could be used within a su or sudo-run shell), it also
causes both coreutils and busybox logname(1) to break conformance:

awilcox on ciall ~ $ su
ciall ~ # LOGNAME=helloworld logname

The correct behaviour is shown here on glibc:

awilcox on ciall [pts/16 Sun 5 16:51] ~: su
ciall awilcox # LOGNAME=helloworld logname

The POSIX standard states that implementations generally check the
terminal of fds 0/1/2, then fall back to /dev/tty.[6]


Discussion required


The musl implementation of getdate(3)[7] sets getdate_err to 7 for any
of the reasons that it should set to 5 (I/O error while reading
template file - i.e., fgets fails), 7 (there is no line in the
template that matches the input), or 8 (invalid input specification)[8].

While I realise musl will probably never implement all conditions that
could provide error condition 8, I feel that error condition 5 should
at least be implemented.  Something as simple as if (ferror(f))
getdate_err = 5;  else getdate_err = 7;  could suffice, IMO.  However,
it would be nice to see better, more robust error handling for
condition 8 as well.


Best regards,

A. Wilcox (awilfox)
Project Lead, Adélie Linux

Download attachment "signature.asc" of type "application/pgp-signature" (820 bytes)

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.