a58c439a2d
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] |
||
---|---|---|
.. | ||
accel.h | ||
async-teardown.h | ||
atomic128.h | ||
atomic.h | ||
base64.h | ||
bcd.h | ||
bitmap.h | ||
bitops.h | ||
bswap.h | ||
buffer.h | ||
cacheflush.h | ||
cacheinfo.h | ||
chardev_open.h | ||
clang-tsa.h | ||
co-shared-resource.h | ||
compiler.h | ||
config-file.h | ||
coroutine_int.h | ||
coroutine-core.h | ||
coroutine-tls.h | ||
coroutine.h | ||
cpu-float.h | ||
cpuid.h | ||
crc32c.h | ||
crc-ccitt.h | ||
ctype.h | ||
cutils.h | ||
datadir.h | ||
dbus.h | ||
defer-call.h | ||
drm.h | ||
envlist.h | ||
error-report.h | ||
event_notifier.h | ||
fifo8.h | ||
fifo32.h | ||
filemonitor.h | ||
futex.h | ||
guest-random.h | ||
hbitmap.h | ||
help_option.h | ||
help-texts.h | ||
host-utils.h | ||
hw-version.h | ||
id.h | ||
int128.h | ||
interval-tree.h | ||
iov.h | ||
iova-tree.h | ||
jhash.h | ||
job.h | ||
keyval.h | ||
lockable.h | ||
log-for-trace.h | ||
log.h | ||
madvise.h | ||
main-loop.h | ||
memalign.h | ||
memfd.h | ||
mmap-alloc.h | ||
module.h | ||
mprotect.h | ||
notify.h | ||
nvdimm-utils.h | ||
option_int.h | ||
option.h | ||
osdep.h | ||
path.h | ||
plugin-event.h | ||
plugin-memory.h | ||
plugin.h | ||
pmem.h | ||
processor.h | ||
progress_meter.h | ||
qdist.h | ||
qemu-plugin.h | ||
qemu-print.h | ||
qemu-progress.h | ||
qht.h | ||
qsp.h | ||
qtree.h | ||
queue.h | ||
range.h | ||
ratelimit.h | ||
rcu_queue.h | ||
rcu.h | ||
readline.h | ||
reserved-region.h | ||
selfmap.h | ||
seqlock.h | ||
sockets.h | ||
stats64.h | ||
sys_membarrier.h | ||
systemd.h | ||
thread-context.h | ||
thread-posix.h | ||
thread-win32.h | ||
thread.h | ||
throttle-options.h | ||
throttle.h | ||
timed-average.h | ||
timer.h | ||
transactions.h | ||
tsan.h | ||
typedefs.h | ||
unicode.h | ||
units.h | ||
uri.h | ||
userfaultfd.h | ||
uuid.h | ||
vfio-helpers.h | ||
vhost-user-server.h | ||
win_dump_defs.h | ||
xattr.h | ||
xxhash.h | ||
yank.h |