On Fri, Mar 05, 2010 at 11:20:38PM -0500, Laine Stump wrote:
doTunnelSendAll function (used by QEMU migration) uses a 64k buffer
on
the stack, which could be problematic. This patch replaces that with a
buffer from the heap.
While in the neighborhood, this patch also improves error reporting in
the case that saferead fails - previously, virStreamAbort() was called
(resetting errno) before reporting the error. It's been changed to
report the error first.
---
Eric noticed that I was inconsistent in the ordering of cleanup
vs. error reporting, so I fixed that in this version.
src/qemu/qemu_driver.c | 18 +++++++++++++++---
1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index bb3edde..5a18938 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8399,19 +8399,28 @@ cleanup:
}
+#define TUNNEL_SEND_BUF_SIZE 65536
+
static int doTunnelSendAll(virStreamPtr st,
int sock)
{
- char buffer[65536];
- int nbytes = sizeof(buffer);
+ char *buffer;
+ int nbytes = TUNNEL_SEND_BUF_SIZE;
+
+ if (VIR_ALLOC_N(buffer, TUNNEL_SEND_BUF_SIZE) < 0) {
+ virReportOOMError();
+ virStreamAbort(st);
+ return -1;
+ }
/* XXX should honour the 'resource' parameter here */
for (;;) {
nbytes = saferead(sock, buffer, nbytes);
if (nbytes < 0) {
- virStreamAbort(st);
virReportSystemError(errno, "%s",
_("tunnelled migration failed to read from
qemu"));
+ virStreamAbort(st);
+ VIR_FREE(buffer);
return -1;
}
else if (nbytes == 0)
@@ -8421,10 +8430,13 @@ static int doTunnelSendAll(virStreamPtr st,
if (virStreamSend(st, buffer, nbytes) < 0) {
qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("Failed to write migration data to remote
libvirtd"));
+ VIR_FREE(buffer);
return -1;
}
}
+ VIR_FREE(buffer);
+
if (virStreamFinish(st) < 0)
/* virStreamFinish set the error for us */
return -1;
ACK, that needed to be fixed !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/