From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33364) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDLYI-0006et-Rc for qemu-devel@nongnu.org; Tue, 11 Feb 2014 17:11:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WDLYA-0006ZO-Da for qemu-devel@nongnu.org; Tue, 11 Feb 2014 17:11:38 -0500 Received: from mail-wi0-x229.google.com ([2a00:1450:400c:c05::229]:38384) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDLYA-0006YM-6i for qemu-devel@nongnu.org; Tue, 11 Feb 2014 17:11:30 -0500 Received: by mail-wi0-f169.google.com with SMTP id e4so432258wiv.2 for ; Tue, 11 Feb 2014 14:11:29 -0800 (PST) Sender: Paolo Bonzini Message-ID: <52FAA00D.6010402@redhat.com> Date: Tue, 11 Feb 2014 23:11:25 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1392155791-30709-1-git-send-email-quintela@redhat.com> In-Reply-To: <1392155791-30709-1-git-send-email-quintela@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] qemu_file: use fwrite() correctly List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Juan Quintela , qemu-devel@nongnu.org Il 11/02/2014 22:56, Juan Quintela ha scritto: > fwrite() returns the number of items written. But when there is one > error, it can return a short write. > > In the particular bug that I was tracking, I did a migration to a > read-only filesystem. And it was able to finish the migration > correctly. fwrite() never returned a negative error code, nor zero, > always 4096. (migration writes chunks of about 14000 bytes). And it > was able to "complete" the migration with success (yes, reading the > file was a bit more difficult). > > To add insult to injury, if your amount of memory was big enough (12GB > on my case), it overwrote some important structure, and from them, > malloc failed. This check makes the problem go away. > > Signed-off-by: Juan Quintela > --- > qemu-file.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/qemu-file.c b/qemu-file.c > index 9473b67..f074af1 100644 > --- a/qemu-file.c > +++ b/qemu-file.c > @@ -100,7 +100,14 @@ static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, > int size) > { > QEMUFileStdio *s = opaque; > - return fwrite(buf, 1, size, s->stdio_file); > + int res; > + > + res = fwrite(buf, 1, size, s->stdio_file); > + > + if (res != size) { > + return -EIO; /* fake errno value */ Can you return -errno here? No need for a fake value. Paolo > + } > + return res; > } > > static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) >