Add the second patch for #523158
This commit is contained in:
parent
9d0bc882fa
commit
3712441ea6
@ -1,4 +1,4 @@
|
|||||||
From 8c8bca077a913e7ae49798400f4ac3f121600881 Mon Sep 17 00:00:00 2001
|
From 0b846a30468a6b4586407f020ccde7bb51afaf98 Mon Sep 17 00:00:00 2001
|
||||||
From: Daniel P. Berrange <berrange@redhat.com>
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
Date: Mon, 12 Oct 2009 20:03:50 +0100
|
Date: Mon, 12 Oct 2009 20:03:50 +0100
|
||||||
Subject: [PATCH] Fix QEMU restore from file in raw format
|
Subject: [PATCH] Fix QEMU restore from file in raw format
|
||||||
@ -13,7 +13,7 @@ in the program name.
|
|||||||
|
|
||||||
(cherry picked from commit 74b379cbd5ba9f472a3a2d5710e497966b1a3a37)
|
(cherry picked from commit 74b379cbd5ba9f472a3a2d5710e497966b1a3a37)
|
||||||
|
|
||||||
Fedora-patch: libvirt-fix-qemu-restore-from-raw.patch
|
Fedora-patch: libvirt-fix-qemu-restore-from-raw1.patch
|
||||||
---
|
---
|
||||||
src/qemu_driver.c | 3 +--
|
src/qemu_driver.c | 3 +--
|
||||||
1 files changed, 1 insertions(+), 2 deletions(-)
|
1 files changed, 1 insertions(+), 2 deletions(-)
|
120
libvirt-fix-qemu-restore-from-raw2.patch
Normal file
120
libvirt-fix-qemu-restore-from-raw2.patch
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
From 57d7cc602d14c6b50e2826e427a5de124e479f95 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
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
|
||||||
|
|
@ -188,7 +188,8 @@ Patch12: libvirt-fix-device-detach-typo3.patch
|
|||||||
Patch13: libvirt-fix-libvirtd-leak-in-error-reply.patch
|
Patch13: libvirt-fix-libvirtd-leak-in-error-reply.patch
|
||||||
|
|
||||||
# Fix restore of qemu guest using raw save format (#523158)
|
# 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
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||||
URL: http://libvirt.org/
|
URL: http://libvirt.org/
|
||||||
@ -419,6 +420,7 @@ of recent versions of Linux (and other OSes).
|
|||||||
%patch12 -p1
|
%patch12 -p1
|
||||||
%patch13 -p1
|
%patch13 -p1
|
||||||
%patch14 -p1
|
%patch14 -p1
|
||||||
|
%patch15 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# Needed for libvirt-logrotate-create-lxc-uml-dirs.patch
|
# Needed for libvirt-logrotate-create-lxc-uml-dirs.patch
|
||||||
|
Loading…
Reference in New Issue
Block a user