@@ -215,14 +215,22 @@ void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size)
void qemu_iovec_destroy(QEMUIOVector *qiov)
{
- assert(qiov->nalloc != -1);
+ if (qiov->nalloc != -1) {
+ qemu_free(qiov->iov);
+ qiov->nalloc = 0;
+ qiov->iov = NULL;
+ }
- qemu_free(qiov->iov);
+ qiov->niov = 0;
+ qiov->size = 0;
}
void qemu_iovec_reset(QEMUIOVector *qiov)
{
- assert(qiov->nalloc != -1);
+ if (qiov->nalloc == -1) {
+ qiov->nalloc = 0;
+ qiov->iov = NULL;
+ }
qiov->niov = 0;
qiov->size = 0;
qemu_iovec_reset and qemu_iovec_destroy will switch from external to internal storage (it was previously forbidden to call it with external storage). So, qemu_iovec_destroy followed by qemu_iovec_init_external will not leak memory when called on a qiov that already had internal storage allocated. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- cutils.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-)