All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>,
	 qemu-devel@nongnu.org, marcandre.lureau@redhat.com,
	 pbonzini@redhat.com, devel@lists.libvirt.org
Subject: Re: [PATCH 1/4] chardev/parallel: Don't close stdin on inappropriate device
Date: Thu, 08 Feb 2024 07:52:33 +0100	[thread overview]
Message-ID: <875xyzjvm6.fsf@pond.sub.org> (raw)
In-Reply-To: <rnzorvci7ca55cisgobnwfkz6yvjh74nnxyhnr4nnozeszw5no@rqnyu73dg7wf> (Eric Blake's message of "Wed, 7 Feb 2024 13:15:59 -0600")

Eric Blake <eblake@redhat.com> writes:

> On Sat, Feb 03, 2024 at 09:02:25AM +0100, Markus Armbruster wrote:
>> 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.
>
> Two bugs for the price of one!
>
>> 
>> The 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().
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>> +++ b/include/qemu/osdep.h
>> @@ -508,11 +508,18 @@ void qemu_anon_ram_free(void *ptr, size_t size);
>>  
>>  #ifdef _WIN32
>>  #define HAVE_CHARDEV_SERIAL 1
>> -#elif defined(__linux__) || defined(__sun__) || defined(__FreeBSD__)    \
>> +#define HAVE_CHARDEV_PARALLEL 1
>> +#else
>> +#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__)   \
>>      || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
>>      || defined(__GLIBC__) || defined(__APPLE__)
>>  #define HAVE_CHARDEV_SERIAL 1
>>  #endif
>> +#if defined(__linux__) || defined(__FreeBSD__) \
>> +    || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
>> +#define HAVE_CHARDEV_PARALLEL 1
>> +#endif
>> +#endif
>
> Not for this patch, but I've grown to like a preprocessor style I've
> seen in other projects to make it easier to read nested #if:
>
> #ifdef _WIN32
> # define HAVE_CHARDEV_SERIAL 1
> # define HAVE_CHARDEV_PARALLEL 1
> #else
> # if defined(__linux__) ... defined(__APPLE__)
> #  define HAVE_CHARDEV_SERIAL 1
> # endif
> # if defined(__linux__) ... defined(__DragonFly__)
> #  define HAVE_CHARDEV_PARALLEL 1
> # endif
> #endif

I like this style, too.

>> +++ b/chardev/meson.build
>> @@ -21,11 +21,9 @@ if host_os == 'windows'
>>  else
>>    chardev_ss.add(files(
>>        'char-fd.c',
>> +        'char-parallel.c',
>>        'char-pty.c',
>
> Indentation looks off.  Otherwise,

Will fix.

> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



  reply	other threads:[~2024-02-08  6:53 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-03  8:02 [PATCH 0/4] char: Minor fixes, and a tighter QAPI schema Markus Armbruster
2024-02-03  8:02 ` [PATCH 1/4] chardev/parallel: Don't close stdin on inappropriate device Markus Armbruster
2024-02-07 19:15   ` Eric Blake
2024-02-08  6:52     ` Markus Armbruster [this message]
2024-02-13 13:58   ` Markus Armbruster
2024-02-13 18:25     ` Marc-André Lureau
2024-02-03  8:02 ` [PATCH 2/4] tests/unit/test-char: Fix qemu_socket(), make_udp_socket() check Markus Armbruster
2024-02-07 19:45   ` Eric Blake
2024-02-08  6:52     ` Markus Armbruster
2024-02-03  8:02 ` [PATCH 3/4] qapi/char: Make backend types properly conditional Markus Armbruster
2024-02-07 19:47   ` Eric Blake
2024-02-03  8:02 ` [PATCH 4/4] qapi/char: Deprecate backend type "memory" Markus Armbruster
2024-02-05  9:37   ` Ján Tomko
2024-02-07 19:48   ` Eric Blake
2024-02-03 11:07 ` [PATCH 0/4] char: Minor fixes, and a tighter QAPI schema Marc-André Lureau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=875xyzjvm6.fsf@pond.sub.org \
    --to=armbru@redhat.com \
    --cc=devel@lists.libvirt.org \
    --cc=eblake@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.