From 3712441ea6bca5213046fbd3c9166bebb81e08c4 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Oct 13 2009 15:43:47 +0000 Subject: Add the second patch for #523158 --- diff --git a/libvirt-fix-qemu-restore-from-raw.patch b/libvirt-fix-qemu-restore-from-raw.patch deleted file mode 100644 index 2d3c8e1..0000000 --- a/libvirt-fix-qemu-restore-from-raw.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 8c8bca077a913e7ae49798400f4ac3f121600881 Mon Sep 17 00:00:00 2001 -From: Daniel P. Berrange -Date: Mon, 12 Oct 2009 20:03:50 +0100 -Subject: [PATCH] Fix QEMU restore from file in raw format - -The logic for running the decompression programs was broken in -commit f238709304f9f6c57204cdd943e542cbae38fa5f, so that for -non-raw formats the decompression program was never run, and -for raw formats, it tried to exec an argv[] with initial NULL -in the program name. - -* src/qemu/qemu_driver.c: Fix logic in runing decompression program - -(cherry picked from commit 74b379cbd5ba9f472a3a2d5710e497966b1a3a37) - -Fedora-patch: libvirt-fix-qemu-restore-from-raw.patch ---- - src/qemu_driver.c | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -diff --git a/src/qemu_driver.c b/src/qemu_driver.c -index 550a59c..0ce403c 100644 ---- a/src/qemu_driver.c -+++ b/src/qemu_driver.c -@@ -4541,9 +4541,8 @@ static int qemudDomainRestore(virConnectPtr conn, - goto cleanup; - } - -- if (header.compressed != QEMUD_SAVE_FORMAT_RAW) -+ if (header.compressed != QEMUD_SAVE_FORMAT_RAW) { - intermediate_argv[0] = prog; -- else { - intermediatefd = fd; - fd = -1; - if (virExec(conn, intermediate_argv, NULL, NULL, --- -1.6.2.5 - diff --git a/libvirt-fix-qemu-restore-from-raw1.patch b/libvirt-fix-qemu-restore-from-raw1.patch new file mode 100644 index 0000000..a4f224d --- /dev/null +++ b/libvirt-fix-qemu-restore-from-raw1.patch @@ -0,0 +1,38 @@ +From 0b846a30468a6b4586407f020ccde7bb51afaf98 Mon Sep 17 00:00:00 2001 +From: Daniel P. Berrange +Date: Mon, 12 Oct 2009 20:03:50 +0100 +Subject: [PATCH] Fix QEMU restore from file in raw format + +The logic for running the decompression programs was broken in +commit f238709304f9f6c57204cdd943e542cbae38fa5f, so that for +non-raw formats the decompression program was never run, and +for raw formats, it tried to exec an argv[] with initial NULL +in the program name. + +* src/qemu/qemu_driver.c: Fix logic in runing decompression program + +(cherry picked from commit 74b379cbd5ba9f472a3a2d5710e497966b1a3a37) + +Fedora-patch: libvirt-fix-qemu-restore-from-raw1.patch +--- + src/qemu_driver.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +diff --git a/src/qemu_driver.c b/src/qemu_driver.c +index 550a59c..0ce403c 100644 +--- a/src/qemu_driver.c ++++ b/src/qemu_driver.c +@@ -4541,9 +4541,8 @@ static int qemudDomainRestore(virConnectPtr conn, + goto cleanup; + } + +- if (header.compressed != QEMUD_SAVE_FORMAT_RAW) ++ if (header.compressed != QEMUD_SAVE_FORMAT_RAW) { + intermediate_argv[0] = prog; +- else { + intermediatefd = fd; + fd = -1; + if (virExec(conn, intermediate_argv, NULL, NULL, +-- +1.6.2.5 + diff --git a/libvirt-fix-qemu-restore-from-raw2.patch b/libvirt-fix-qemu-restore-from-raw2.patch new file mode 100644 index 0000000..5ad8a59 --- /dev/null +++ b/libvirt-fix-qemu-restore-from-raw2.patch @@ -0,0 +1,120 @@ +From 57d7cc602d14c6b50e2826e427a5de124e479f95 Mon Sep 17 00:00:00 2001 +From: Daniel P. Berrange +Date: Mon, 12 Oct 2009 20:32:33 +0100 +Subject: [PATCH] Fix virFileReadLimFD/virFileReadAll to handle EINTR + +The fread_file_lim() function uses fread() but never handles +EINTR results, causing unexpected failures when reading QEMU +help arg info. It was unneccessarily using FILE * instead +of plain UNIX file handles, which prevented use of saferead() + +* src/util/util.c: Switch fread_file_lim over to use saferead + instead of fread, remove FILE * use, and rename + +(cherry picked from commit 11a36d956cb8a5e439e535bff3e0cfce50a64bca) + +Fedora-patch: libvirt-fix-qemu-restore-from-raw2.patch +--- + src/util.c | 45 ++++++++++++--------------------------------- + 1 files changed, 12 insertions(+), 33 deletions(-) + +diff --git a/src/util.c b/src/util.c +index 1878e33..7bc3a66 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -887,7 +887,7 @@ virExec(virConnectPtr conn, + number of bytes. If the length of the input is <= max_len, and + upon error while reading that data, it works just like fread_file. */ + static char * +-fread_file_lim (FILE *stream, size_t max_len, size_t *length) ++saferead_lim (int fd, size_t max_len, size_t *length) + { + char *buf = NULL; + size_t alloc = 0; +@@ -895,8 +895,8 @@ fread_file_lim (FILE *stream, size_t max_len, size_t *length) + int save_errno; + + for (;;) { +- size_t count; +- size_t requested; ++ int count; ++ int requested; + + if (size + BUFSIZ + 1 > alloc) { + alloc += alloc / 2; +@@ -912,12 +912,12 @@ fread_file_lim (FILE *stream, size_t max_len, size_t *length) + /* Ensure that (size + requested <= max_len); */ + requested = MIN (size < max_len ? max_len - size : 0, + alloc - size - 1); +- count = fread (buf + size, 1, requested, stream); ++ count = saferead (fd, buf + size, requested); + size += count; + + if (count != requested || requested == 0) { + save_errno = errno; +- if (ferror (stream)) ++ if (count < 0) + break; + buf[size] = '\0'; + *length = size; +@@ -930,12 +930,12 @@ fread_file_lim (FILE *stream, size_t max_len, size_t *length) + return NULL; + } + +-/* A wrapper around fread_file_lim that maps a failure due to ++/* A wrapper around saferead_lim that maps a failure due to + exceeding the maximum size limitation to EOVERFLOW. */ +-static int virFileReadLimFP(FILE *fp, int maxlen, char **buf) ++int virFileReadLimFD(int fd, int maxlen, char **buf) + { + size_t len; +- char *s = fread_file_lim (fp, maxlen+1, &len); ++ char *s = saferead_lim (fd, maxlen+1, &len); + if (s == NULL) + return -1; + if (len > maxlen || (int)len != len) { +@@ -949,37 +949,16 @@ static int virFileReadLimFP(FILE *fp, int maxlen, char **buf) + return len; + } + +-/* Like virFileReadLimFP, but use a file descriptor rather than a FILE*. */ +-int virFileReadLimFD(int fd_arg, int maxlen, char **buf) +-{ +- int fd = dup (fd_arg); +- if (fd >= 0) { +- FILE *fp = fdopen (fd, "r"); +- if (fp) { +- int len = virFileReadLimFP (fp, maxlen, buf); +- int saved_errno = errno; +- fclose (fp); +- errno = saved_errno; +- return len; +- } else { +- int saved_errno = errno; +- close (fd); +- errno = saved_errno; +- } +- } +- return -1; +-} +- + int virFileReadAll(const char *path, int maxlen, char **buf) + { +- FILE *fh = fopen(path, "r"); +- if (fh == NULL) { ++ int fd = open(path, O_RDONLY); ++ if (fd < 0) { + virReportSystemError(NULL, errno, _("Failed to open file '%s'"), path); + return -1; + } + +- int len = virFileReadLimFP (fh, maxlen, buf); +- fclose(fh); ++ int len = virFileReadLimFD(fd, maxlen, buf); ++ close(fd); + if (len < 0) { + virReportSystemError(NULL, errno, _("Failed to read file '%s'"), path); + return -1; +-- +1.6.2.5 + diff --git a/libvirt.spec b/libvirt.spec index 01287ed..548fd05 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -188,7 +188,8 @@ Patch12: libvirt-fix-device-detach-typo3.patch Patch13: libvirt-fix-libvirtd-leak-in-error-reply.patch # Fix restore of qemu guest using raw save format (#523158) -Patch14: libvirt-fix-qemu-restore-from-raw.patch +Patch14: libvirt-fix-qemu-restore-from-raw1.patch +Patch15: libvirt-fix-qemu-restore-from-raw2.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root URL: http://libvirt.org/ @@ -419,6 +420,7 @@ of recent versions of Linux (and other OSes). %patch12 -p1 %patch13 -p1 %patch14 -p1 +%patch15 -p1 %build # Needed for libvirt-logrotate-create-lxc-uml-dirs.patch