Ping ... Liang
> -----Original Message----- > From: Li, Liang Z > Sent: Friday, January 15, 2016 6:06 PM > To: qemu-devel@nongnu.org > Cc: quint...@redhat.com; amit.s...@redhat.com; dgilb...@redhat.com; > zhang.zhanghaili...@huawei.com; Li, Liang Z > Subject: [PATCH RESEND v2 1/2] qemu-file: Fix > qemu_put_compression_data flaw > > Current qemu_put_compression_data can only work with no writable > QEMUFile, and can't work with the writable QEMUFile. But it does not > provide any measure to prevent users from using it with a writable QEMUFile. > > We should fix this flaw to make it works with writable QEMUFile. > > Signed-off-by: Liang Li <liang.z...@intel.com> > --- > migration/qemu-file.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/migration/qemu-file.c b/migration/qemu-file.c index > 0bbd257..b956ab6 100644 > --- a/migration/qemu-file.c > +++ b/migration/qemu-file.c > @@ -606,8 +606,14 @@ uint64_t qemu_get_be64(QEMUFile *f) > return v; > } > > -/* compress size bytes of data start at p with specific compression > +/* Compress size bytes of data start at p with specific compression > * level and store the compressed data to the buffer of f. > + * > + * When f is not writable, return 0 if f has no space to save the > + * compressed data. > + * When f is wirtable and it has no space to save the compressed data, > + * do fflush first, if f still has no space to save the compressed > + * data, return 0. > */ > > ssize_t qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t > size, @@ -616,7 +622,14 @@ ssize_t > qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t size, > ssize_t blen = IO_BUF_SIZE - f->buf_index - sizeof(int32_t); > > if (blen < compressBound(size)) { > - return 0; > + if (!qemu_file_is_writable(f)) { > + return 0; > + } > + qemu_fflush(f); > + blen = IO_BUF_SIZE - sizeof(int32_t); > + if (blen < compressBound(size)) { > + return 0; > + } > } > if (compress2(f->buf + f->buf_index + sizeof(int32_t), (uLongf *)&blen, > (Bytef *)p, size, level) != Z_OK) { @@ -624,7 +637,13 @@ > ssize_t > qemu_put_compression_data(QEMUFile *f, const uint8_t *p, size_t size, > return 0; > } > qemu_put_be32(f, blen); > + if (f->ops->writev_buffer) { > + add_to_iovec(f, f->buf + f->buf_index, blen); > + } > f->buf_index += blen; > + if (f->buf_index == IO_BUF_SIZE) { > + qemu_fflush(f); > + } > return blen + sizeof(int32_t); > } > > -- > 1.9.1