Richard W.M. Jones
2014-Apr-28 08:52 UTC
[Libguestfs] [PATCH 1/2] tar-in: Fix places where we didn't cancel the receive (FileIn) correctly along error paths (RHBZ#1091803).
Thanks: Bo Fan. --- daemon/tar.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/daemon/tar.c b/daemon/tar.c index 548eb89..6723f3a 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -47,11 +47,14 @@ is_chown_supported (const char *dir) { size_t len = sysroot_len + strlen (dir) + 64; char buf[len]; - int fd, r, saved_errno; + int fd, r, err, saved_errno; /* Create a randomly named file. */ snprintf (buf, len, "%s%s/XXXXXXXX.XXX", sysroot, dir); if (random_name (buf) == -1) { + err = errno; + r = cancel_receive (); + errno = err; reply_with_perror ("random_name"); return -1; } @@ -59,6 +62,9 @@ is_chown_supported (const char *dir) /* Maybe 'dir' is not a directory or filesystem not writable? */ fd = open (buf, O_WRONLY|O_CREAT|O_NOCTTY|O_CLOEXEC, 0666); if (fd == -1) { + err = errno; + r = cancel_receive (); + errno = err; reply_with_perror ("%s", dir); return -1; } @@ -78,6 +84,9 @@ is_chown_supported (const char *dir) if (r == -1) { /* Some other error? */ + err = errno; + r = cancel_receive (); + errno = err; reply_with_perror_errno (saved_errno, "unexpected error in fchown"); return -1; } @@ -153,6 +162,9 @@ do_tar_in (const char *dir, const char *compress) fd = mkstemp (error_file); if (fd == -1) { + err = errno; + r = cancel_receive (); + errno = err; reply_with_perror ("mkstemp"); return -1; } -- 1.8.5.3
Richard W.M. Jones
2014-Apr-28 08:52 UTC
[Libguestfs] [PATCH 2/2] Add a regression test for RHBZ#1091803.
--- tests/regressions/Makefile.am | 2 ++ tests/regressions/rhbz1091803.sh | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 tests/regressions/rhbz1091803.sh diff --git a/tests/regressions/Makefile.am b/tests/regressions/Makefile.am index ac7da56..a5e7cfc 100644 --- a/tests/regressions/Makefile.am +++ b/tests/regressions/Makefile.am @@ -41,6 +41,7 @@ EXTRA_DIST = \ rhbz1044014.in \ rhbz1044014.xml \ rhbz1054761.sh \ + rhbz1091803.sh \ test-noexec-stack.pl TESTS = \ @@ -64,6 +65,7 @@ TESTS = \ rhbz1001875.sh \ rhbz1054761.sh \ rhbz1055452 \ + rhbz1091803.sh \ test-noexec-stack.pl if HAVE_LIBVIRT diff --git a/tests/regressions/rhbz1091803.sh b/tests/regressions/rhbz1091803.sh new file mode 100755 index 0000000..e9be95d --- /dev/null +++ b/tests/regressions/rhbz1091803.sh @@ -0,0 +1,39 @@ +#!/bin/bash - +# libguestfs +# Copyright (C) 2014 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +# Regression test for: +# https://bugzilla.redhat.com/show_bug.cgi?id=1091803 +# tar-in API didn't cancel the receive correctly along all error paths. + +set -e +export LANG=C + +if [ -n "$SKIP_TEST_RHBZ1091803_SH" ]; then + echo "$0: test skipped because environment variable is set." + exit 77 +fi + +../../fish/guestfish <<EOF +scratch 100M +run +mkfs ext2 /dev/sda +mount /dev/sda / +-tar-in nosuchtarfile.tar /nosuchdirectory +# Appliance has now crashed, so any subsequent command fails: +ping-daemon +EOF -- 1.8.5.3