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 <berrange@redhat.com>
-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 <berrange@redhat.com>
+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 <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
+
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