diff mbox

[v2] libxc: fix leak of t_info in xc_tbuf_get_size()

Message ID 1455179579-3476-1-git-send-email-write.harmandeep@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Harmandeep Kaur Feb. 11, 2016, 8:32 a.m. UTC
Avoid leaking the memory mapping of the trace buffer

Coverity ID 1351228

Signed-off-by: Harmandeep Kaur <write.harmandeep@gmail.com>
---
v2: call to unmapping function reduced to one from two
---
 tools/libxc/xc_tbuf.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Dario Faggioli Feb. 11, 2016, 9:14 a.m. UTC | #1
On Thu, 2016-02-11 at 14:02 +0530, Harmandeep Kaur wrote:
> Avoid leaking the memory mapping of the trace buffer
> 
> Coverity ID 1351228
> 
> Signed-off-by: Harmandeep Kaur <write.harmandeep@gmail.com>
>
Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com>

Thanks and Regards,
Dario
Ian Campbell Feb. 11, 2016, 9:52 a.m. UTC | #2
Copying George since he maintains xentrace which this relates to.

On Thu, 2016-02-11 at 14:02 +0530, Harmandeep Kaur wrote:
> Avoid leaking the memory mapping of the trace buffer
> 
> Coverity ID 1351228
> 
> Signed-off-by: Harmandeep Kaur <write.harmandeep@gmail.com>
> ---
> v2: call to unmapping function reduced to one from two
> ---
>  tools/libxc/xc_tbuf.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c
> index 695939a..d96cc67 100644
> --- a/tools/libxc/xc_tbuf.c
> +++ b/tools/libxc/xc_tbuf.c
> @@ -70,11 +70,13 @@ int xc_tbuf_get_size(xc_interface *xch, unsigned long
> *size)
>                      sysctl.u.tbuf_op.buffer_mfn);
>  
>      if ( t_info == NULL || t_info->tbuf_size == 0 )
> -        return -1;
> +        rc = -1;
> +    else
> +	*size = t_info->tbuf_size;
>  
> -    *size = t_info->tbuf_size;
> +    xenforeignmemory_unmap(xch->fmem, t_info, *size);

*size could be uninitialised here (in the error path) and even in the
success case I don't think t_info->tbus_size is the right argument here, it
needs to be the size which was passed to the map function, i.e.
sysctl.u.tbuf_op.size.

Ian.

>  
> -    return 0;
> +    return rc;
>  }
>  
>  int xc_tbuf_enable(xc_interface *xch, unsigned long pages, unsigned long
> *mfn,
Dario Faggioli Feb. 11, 2016, 10:03 a.m. UTC | #3
On Thu, 2016-02-11 at 09:52 +0000, Ian Campbell wrote:
> On Thu, 2016-02-11 at 14:02 +0530, Harmandeep Kaur wrote:
> > 
> > diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c
> > index 695939a..d96cc67 100644
> > --- a/tools/libxc/xc_tbuf.c
> > +++ b/tools/libxc/xc_tbuf.c
> > @@ -70,11 +70,13 @@ int xc_tbuf_get_size(xc_interface *xch,
> > unsigned long
> > *size)
> >                      sysctl.u.tbuf_op.buffer_mfn);
> >  
> >      if ( t_info == NULL || t_info->tbuf_size == 0 )
> > -        return -1;
> > +        rc = -1;
> > +    else
> > +	*size = t_info->tbuf_size;
> >  
> > -    *size = t_info->tbuf_size;
> > +    xenforeignmemory_unmap(xch->fmem, t_info, *size);
> 
> *size could be uninitialised here (in the error path) and even in the
> success case I don't think t_info->tbus_size is the right argument
> here, it
> needs to be the size which was passed to the map function, i.e.
> sysctl.u.tbuf_op.size.
> 
And I think both are issues with the current code, and, more important,
not what Coverity is complaining about in the referenced CID?

To be clear, I'm not arguing that they're not issues we should fix (I
don't know about the tbuf_size vs. tbuf_op.size, but I can check). I'm
genuinely asking whether we should do that here, as compared to in a
pre or follow up patch, and let this one be the one that placates
Coverity on that particular issue.

Regards,
Dario
Ian Campbell Feb. 11, 2016, 10:11 a.m. UTC | #4
On Thu, 2016-02-11 at 11:03 +0100, Dario Faggioli wrote:
> On Thu, 2016-02-11 at 09:52 +0000, Ian Campbell wrote:
> > On Thu, 2016-02-11 at 14:02 +0530, Harmandeep Kaur wrote:
> > >  
> > > diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c
> > > index 695939a..d96cc67 100644
> > > --- a/tools/libxc/xc_tbuf.c
> > > +++ b/tools/libxc/xc_tbuf.c
> > > @@ -70,11 +70,13 @@ int xc_tbuf_get_size(xc_interface *xch,
> > > unsigned long
> > > *size)
> > >                      sysctl.u.tbuf_op.buffer_mfn);
> > >  
> > >      if ( t_info == NULL || t_info->tbuf_size == 0 )
> > > -        return -1;
> > > +        rc = -1;
> > > +    else
> > > +	*size = t_info->tbuf_size;
> > >  
> > > -    *size = t_info->tbuf_size;
> > > +    xenforeignmemory_unmap(xch->fmem, t_info, *size);
> > 
> > *size could be uninitialised here (in the error path) and even in the
> > success case I don't think t_info->tbus_size is the right argument
> > here, it
> > needs to be the size which was passed to the map function, i.e.
> > sysctl.u.tbuf_op.size.
> > 
> And I think both are issues with the current code,

I don't think so, the xenforeignmemory_unmap using *size as an argument
(where it is either uninitialised or the wrong value) is added by this
patch.

>  and, more important,
> not what Coverity is complaining about in the referenced CID?

> To be clear, I'm not arguing that they're not issues we should fix (I
> don't know about the tbuf_size vs. tbuf_op.size, but I can check). I'm
> genuinely asking whether we should do that here, as compared to in a
> pre or follow up patch, and let this one be the one that placates
> Coverity on that particular issue.

Ian.
Dario Faggioli Feb. 11, 2016, 10:23 a.m. UTC | #5
On Thu, 2016-02-11 at 10:11 +0000, Ian Campbell wrote:
> On Thu, 2016-02-11 at 11:03 +0100, Dario Faggioli wrote:
> > On Thu, 2016-02-11 at 09:52 +0000, Ian Campbell wrote:
> > > On Thu, 2016-02-11 at 14:02 +0530, Harmandeep Kaur wrote:
> > > >  
> > > > diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c
> > > > index 695939a..d96cc67 100644
> > > > --- a/tools/libxc/xc_tbuf.c
> > > > +++ b/tools/libxc/xc_tbuf.c
> > > > @@ -70,11 +70,13 @@ int xc_tbuf_get_size(xc_interface *xch,
> > > > unsigned long
> > > > *size)
> > > >                      sysctl.u.tbuf_op.buffer_mfn);
> > > >  
> > > >      if ( t_info == NULL || t_info->tbuf_size == 0 )
> > > > -        return -1;
> > > > +        rc = -1;
> > > > +    else
> > > > +	*size = t_info->tbuf_size;
> > > >  
> > > > -    *size = t_info->tbuf_size;
> > > > +    xenforeignmemory_unmap(xch->fmem, t_info, *size);
> > > 
> > > *size could be uninitialised here (in the error path) and even in
> > > the
> > > success case I don't think t_info->tbus_size is the right
> > > argument
> > > here, it
> > > needs to be the size which was passed to the map function, i.e.
> > > sysctl.u.tbuf_op.size.
> > > 
> > And I think both are issues with the current code,
> 
> I don't think so, the xenforeignmemory_unmap using *size as an
> argument
> (where it is either uninitialised or the wrong value) is added by
> this
> patch.
> 
Ah, that one! Yes, you're right, I had overlooked this, and thought you
where referring to something else, sorry. I agree sysctl.u.tbuf_op.size
is what should be used.

Regards,
Dario
diff mbox

Patch

diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c
index 695939a..d96cc67 100644
--- a/tools/libxc/xc_tbuf.c
+++ b/tools/libxc/xc_tbuf.c
@@ -70,11 +70,13 @@  int xc_tbuf_get_size(xc_interface *xch, unsigned long *size)
                     sysctl.u.tbuf_op.buffer_mfn);
 
     if ( t_info == NULL || t_info->tbuf_size == 0 )
-        return -1;
+        rc = -1;
+    else
+	*size = t_info->tbuf_size;
 
-    *size = t_info->tbuf_size;
+    xenforeignmemory_unmap(xch->fmem, t_info, *size);
 
-    return 0;
+    return rc;
 }
 
 int xc_tbuf_enable(xc_interface *xch, unsigned long pages, unsigned long *mfn,