qemu/chardev/meson.build
Markus Armbruster a58c439a2d chardev/parallel: Don't close stdin on inappropriate device
The __linux__ version of qemu_chr_open_pp_fd() tries to claim the
parport device with a PPCLAIM ioctl().  On success, it stores the file
descriptor in the chardev object, and returns success.  On failure, it
closes the file descriptor, and returns failure.

chardev_new() then passes the Chardev to object_unref().  This duly
calls char_parallel_finalize(), which closes the file descriptor
stored in the chardev object.  Since qemu_chr_open_pp_fd() didn't
store it, it's still zero, so this closes standard input.  Ooopsie.

To demonstate, add a unit test.  With the bug above unfixed, running
this test closes standard input.  char_hotswap_test() happens to run
next.  It opens a socket, duly gets file descriptor 0, and since it
tests for success with > 0 instead of >= 0, it fails.

The new unit test needs to be conditional exactly like the chardev it
tests.  Since the condition is rather complicated, steal the solution
from the serial chardev: define HAVE_CHARDEV_PARALLEL in qemu/osdep.h.
This also permits simplifying chardev/meson.build a bit.

The bug fix is easy enough: store the file descriptor, and leave
closing it to char_parallel_finalize().

The next commit will fix char_hotswap_test()'s test for success.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240203080228.2766159-2-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[Test fixed up for BSDs, indentation fixed up, commit message improved]
2024-02-14 07:44:38 +01:00

51 lines
975 B
Meson

chardev_ss.add(files(
'char-fe.c',
'char-file.c',
'char-io.c',
'char-mux.c',
'char-null.c',
'char-pipe.c',
'char-ringbuf.c',
'char-serial.c',
'char-socket.c',
'char-stdio.c',
'char-udp.c',
'char.c',
))
if host_os == 'windows'
chardev_ss.add(files(
'char-console.c',
'char-win-stdio.c',
'char-win.c',
))
else
chardev_ss.add(files(
'char-fd.c',
'char-parallel.c',
'char-pty.c',
), util)
endif
chardev_ss = chardev_ss.apply({})
system_ss.add(files(
'char-hmp-cmds.c',
'msmouse.c',
'wctablet.c',
'testdev.c'))
chardev_modules = {}
if brlapi.found()
module_ss = ss.source_set()
module_ss.add(when: [brlapi], if_true: [files('baum.c'), pixman])
chardev_modules += { 'baum': module_ss }
endif
if spice.found()
module_ss = ss.source_set()
module_ss.add(when: [spice], if_true: files('spice.c'))
chardev_modules += { 'spice': module_ss }
endif
modules += { 'chardev': chardev_modules }