[libvirt] [PATCH] command: avoid double close in virExecWithHook
Daniel P. Berrange
berrange at redhat.com
Tue Aug 21 16:28:46 UTC 2012
On Tue, Aug 21, 2012 at 11:01:44AM +0200, Ján Tomko wrote:
> Fix possible double close in the child process after the fork in case
> infd and outfd are equal, just like they are after being called from
> virNetSocketNewConnectCommand.
> ---
> src/util/command.c | 14 +++++---------
> 1 files changed, 5 insertions(+), 9 deletions(-)
>
> diff --git a/src/util/command.c b/src/util/command.c
> index 7755572..49ec178 100644
> --- a/src/util/command.c
> +++ b/src/util/command.c
> @@ -547,17 +547,13 @@ virExecWithHook(const char *const*argv,
> goto fork_error;
> }
>
> - if (infd != STDIN_FILENO && infd != null)
> + if (infd != STDIN_FILENO && infd != null && infd != childerr &&
> + infd != childout)
> VIR_FORCE_CLOSE(infd);
> - if (childout > STDERR_FILENO && childout != null) {
> - tmpfd = childout; /* preserve childout value */
> - VIR_FORCE_CLOSE(tmpfd);
> - }
> - if (childerr > STDERR_FILENO &&
> - childerr != childout &&
> - childerr != null) {
> + if (childout > STDERR_FILENO && childout != null && childout != childerr)
> + VIR_FORCE_CLOSE(childout);
> + if (childerr > STDERR_FILENO && childerr != null)
> VIR_FORCE_CLOSE(childerr);
> - }
> VIR_FORCE_CLOSE(null);
>
> /* Initialize full logging for a while */
ACK.
I'm wondering if there's some way we can test this in tests/commandtest.c
All I can think of is using a nasty LD_PRELOAD hack again to override
dup/open/close/etc and look for a double-close. Perhaps just leave it up
to valgrind
Daniel;
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list