Previous to OpenBSD 6.3 [1], fcntl(F_SETFL) is not permitted on memory
devices. Do not assert fcntl failures 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é <philmd@redhat.com>
---
util/oslib-posix.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index 4ce1ba9ca4..064c3ae2f7 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -244,7 +244,9 @@ void qemu_set_nonblock(int fd)
f = fcntl(fd, F_GETFL);
assert(f != -1);
f = fcntl(fd, F_SETFL, f | O_NONBLOCK);
+#ifndef __OpenBSD__
assert(f != -1);
+#endif
}
int socket_set_fast_reuse(int fd)
--
2.20.1
Is the XXX in the subject meant to go on permanent record?
On 1/28/19 7:22 AM, Markus Armbruster wrote: > Is the XXX in the subject meant to go on permanent record? The original plan was to rename it as NOTFORMERGE before sending but I forgot (late Friday). So the whole content of this patch isn't meant to go on perm record ;)
Philippe Mathieu-Daudé <philmd@redhat.com> writes: > Previous to OpenBSD 6.3 [1], fcntl(F_SETFL) is not permitted on memory > devices. Do not assert fcntl failures 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." I assume set_nonblock is called on more than just these special devices? Is there anyway to check this on OpenBSD or is it just an anonymous fd at this point? > > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > util/oslib-posix.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index 4ce1ba9ca4..064c3ae2f7 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -244,7 +244,9 @@ void qemu_set_nonblock(int fd) > f = fcntl(fd, F_GETFL); > assert(f != -1); > f = fcntl(fd, F_SETFL, f | O_NONBLOCK); > +#ifndef __OpenBSD__ > assert(f != -1); > +#endif > } > > int socket_set_fast_reuse(int fd) -- Alex Bennée
On 1/28/19 10:47 AM, Alex Bennée wrote: > > Philippe Mathieu-Daudé <philmd@redhat.com> writes: > >> Previous to OpenBSD 6.3 [1], fcntl(F_SETFL) is not permitted on memory >> devices. Do not assert fcntl failures 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." > > I assume set_nonblock is called on more than just these special devices? > Is there anyway to check this on OpenBSD or is it just an anonymous fd > at this point? I'll let an OpenBSD expert to answer that. I forgot to comment, the assert() was added one month ago (da93b82079d), Michael said we can also revert this change. >> >> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> >> --- >> util/oslib-posix.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/util/oslib-posix.c b/util/oslib-posix.c >> index 4ce1ba9ca4..064c3ae2f7 100644 >> --- a/util/oslib-posix.c >> +++ b/util/oslib-posix.c >> @@ -244,7 +244,9 @@ void qemu_set_nonblock(int fd) >> f = fcntl(fd, F_GETFL); >> assert(f != -1); >> f = fcntl(fd, F_SETFL, f | O_NONBLOCK); >> +#ifndef __OpenBSD__ >> assert(f != -1); >> +#endif >> } >> >> int socket_set_fast_reuse(int fd) > > > -- > Alex Bennée >
On 28/01/19 10:47, Alex Bennée wrote: >> >> [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." > I assume set_nonblock is called on more than just these special devices? > Is there anyway to check this on OpenBSD or is it just an anonymous fd > at this point? > Perhaps on OpenBSD we should just assert that we don't get EBADF? Paolo
On 1/28/19 12:03 PM, Paolo Bonzini wrote:
> On 28/01/19 10:47, Alex Bennée wrote:
>>>
>>> [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."
>> I assume set_nonblock is called on more than just these special devices?
>> Is there anyway to check this on OpenBSD or is it just an anonymous fd
>> at this point?
>>
>
> Perhaps on OpenBSD we should just assert that we don't get EBADF?
We get ENODEV for "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.
I'll respin with your suggestion.
Thanks!
Phil.
© 2016 - 2025 Red Hat, Inc.