On Tue, 29 Jan 2019 at 17:59, Philippe Mathieu-Daudé <[email protected]> wrote: > > Previous to OpenBSD 6.3 [1], fcntl(F_SETFL) is not permitted on > memory devices. > Trying this call sets errno to ENODEV ("not a memory device"): > > 19 ENODEV Operation not supported by device. > An attempt was made to apply an inappropriate function to a device, > for example, trying to read a write-only device such as a printer. > > Do not assert fcntl failures in this specific case (errno set to ENODEV) > on OpenBSD. This fixes: > > $ lm32-softmmu/qemu-system-lm32 > assertion "f != -1" failed: file "util/oslib-posix.c", line 247, function > "qemu_set_nonblock" > Abort trap (core dumped) > > [1] The fix seems https://github.com/openbsd/src/commit/c2a35b387f9d3c > "fcntl(F_SETFL) invokes the FIONBIO and FIOASYNC ioctls internally, so > the memory devices (/dev/null, /dev/zero, etc) need to permit them." > > Signed-off-by: Philippe Mathieu-Daudé <[email protected]> > --- > util/oslib-posix.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index 4ce1ba9ca4..2f0f27e6d9 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -244,7 +244,17 @@ void qemu_set_nonblock(int fd) > f = fcntl(fd, F_GETFL); > assert(f != -1); > f = fcntl(fd, F_SETFL, f | O_NONBLOCK); > +#ifdef __OpenBSD__ > + if (f == -1) { > + /* > + * Previous to OpenBSD 6.3, fcntl(F_SETFL) is not permitted on > + * memory devices and sets errno to ENODEV. > + */ > + assert(errno == ENODEV); > + } > +#else > assert(f != -1); > +#endif
You might also add "It's OK if we fail to set O_NONBLOCK on devices like /dev/null, because they will never block anyway." Reviewed-by: Peter Maydell <[email protected]> thanks -- PMM
