diff mbox

[1.0] qiov: prevent double free or use-after-free

Message ID 1322219182-18502-1-git-send-email-pbonzini@redhat.com
State New
Headers show

Commit Message

Paolo Bonzini Nov. 25, 2011, 11:06 a.m. UTC
qemu_iovec_destroy does not clear the QEMUIOVector fully, and the data
could thus be used after free or freed again.  While I do not know any
example in the tree, I observed this using virtio-scsi (and SCSI
scatter/gather) when canceling DMA requests.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 cutils.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

Comments

Paolo Bonzini Nov. 25, 2011, 11:55 a.m. UTC | #1
On 11/25/2011 12:56 PM, Kevin Wolf wrote:
>> qemu_iovec_destroy does not clear the QEMUIOVector fully, and the data
>> >  could thus be used after free or freed again.  While I do not know any
>> >  example in the tree, I observed this using virtio-scsi (and SCSI
>> >  scatter/gather) when canceling DMA requests.
>> >
>> >  Signed-off-by: Paolo Bonzini<pbonzini@redhat.com>
> This isn't a bug fix for itself, it just makes bugs in other code more
> visible, right? It probably makes sense to do this change, but I'm not
> sure about doing it for 1.0.

It is a fix.  NULLing the pointer prevents double-free bugs, and setting 
niov/nalloc to 0 should prevent use-after-free.

Paolo
Kevin Wolf Nov. 25, 2011, 11:56 a.m. UTC | #2
Am 25.11.2011 12:06, schrieb Paolo Bonzini:
> qemu_iovec_destroy does not clear the QEMUIOVector fully, and the data
> could thus be used after free or freed again.  While I do not know any
> example in the tree, I observed this using virtio-scsi (and SCSI
> scatter/gather) when canceling DMA requests.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

This isn't a bug fix for itself, it just makes bugs in other code more
visible, right? It probably makes sense to do this change, but I'm not
sure about doing it for 1.0.

Kevin

> ---
>  cutils.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/cutils.c b/cutils.c
> index 5d995bc..731a27e 100644
> --- a/cutils.c
> +++ b/cutils.c
> @@ -217,7 +217,10 @@ void qemu_iovec_destroy(QEMUIOVector *qiov)
>  {
>      assert(qiov->nalloc != -1);
>  
> +    qemu_iovec_reset(qiov);
>      g_free(qiov->iov);
> +    qiov->nalloc = 0;
> +    qiov->iov = NULL;
>  }
>  
>  void qemu_iovec_reset(QEMUIOVector *qiov)
diff mbox

Patch

diff --git a/cutils.c b/cutils.c
index 5d995bc..731a27e 100644
--- a/cutils.c
+++ b/cutils.c
@@ -217,7 +217,10 @@  void qemu_iovec_destroy(QEMUIOVector *qiov)
 {
     assert(qiov->nalloc != -1);
 
+    qemu_iovec_reset(qiov);
     g_free(qiov->iov);
+    qiov->nalloc = 0;
+    qiov->iov = NULL;
 }
 
 void qemu_iovec_reset(QEMUIOVector *qiov)