Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241026230350.GA10433@brightrain.aerifal.cx>
Date: Sat, 26 Oct 2024 19:03:50 -0400
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: Prototypes without implementations

On Sun, Oct 27, 2024 at 12:08:25AM +0200, Thorsten Glaser wrote:
> On Sat, 26 Oct 2024, Markus Wichmann wrote:
> 
> >See above. Failing with ENOSYS and no side effects is a perfectly
> >conforming implementation of most POSIX functions.
> 
> Insisting on this ivory tower opinion will just make people
> mark your software as buggy and move on.
> 
> For most functions, it’s reasonable to check for presence,
> and if so, enable codepaths that do:
> 
> 	if (pselect(…) == -1) {
> 		if (errno == EINTR) {
> 			// special handling
> 		}
> 		err(1, "pselect");
> 	}
> 
> The vast majority of software, OSS and not, works this way.
> If a basic function in a standard is there it better function.
> 
> Linux’ getrandom() is an offensive exception to that and better
> stay the only one.

This thread has veered really off-topic. I haven't read it in full,
but based on what it seems to be about, a few remarks:

- I don't buy that ENOSYS buys you a license to omit parts of POSIX
  you don't want to implement. Yes there's license to have additional
  errors not defined in the standard, but the only reasonable
  interpretation is that these should be for concrete conditions that
  can be remedied. At the very least, an interface always failing is
  bad QoI. As an example, I don't claim running on a nommu system,
  where fork() will necessarily ENOSYS, gives a POSIX-conforming
  environment; it's a POSIX subset. IIRC part of the rationale text
  addresses that and agrees with my interpretation here.

- pselect ENOSYS? Come on. This is 2024, almost 2025, not 1999.
  (Unless I'm misremembering it was added in POSIX 2001.)

- Back to extension interfaces (or very recent standards) which might
  or might not be available at runtime: Whether availability of a
  particular such interface is reasonable to defer to runtime really
  depends on what the interface is and what it's being used for.
  Trying to make broad sweeping generalizations does not seem helpful,
  and particularly, does not seem relevant to the ioperm/iopl topic.

- That said, yes, whether an interface is available at the library
  level, and whether it works on the machine you happen to be running
  on later, can differ, and this is something where "musl policy"
  (using the term very loosely, in the sense of what we recommend to
  projects when trying to get something fixed) is that, unless the
  standard says the interface and functionality is always present, you
  should both check for it at configure-time/build-time, and be
  prepared at runtime for the possibility that it might not be
  supported or might not support all features on the running system. I
  would expect software using iopl/ioperm already needs to be prepared
  for the possibility that they could fail for permissions reasons,
  and should avoid calling them anyway unless it knows it needs to
  perform userspace hardware IO. So I'm not sure how this matters or
  how an ENOSYS here would be any different from EPERM -- it's just
  another reason you can't do IO as a user process.

Can we use the remainder of this thread for figuring out the real
status of this (what's with non-x86 archs that have the syscalls? are
they used? what about archs that don't use them? do they have you mmap
a device instead?) and whether there's some action that should be
taken, rather than rehashing broad philosophy? :)

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.