[PATCH]: vfs_glusterfs: Use after free.
Ira Cooper
ira at wakeful.net
Sat Mar 5 12:22:11 UTC 2016
On Friday, March 4, 2016, Jeremy Allison <jra at samba.org> wrote:
> On Fri, Mar 04, 2016 at 06:18:27PM -0500, Ira Cooper wrote:
> > This is a pure crash bug as far as I can see, but one that needs to be
> > fixed.
> >
> > BUG: https://bugzilla.samba.org/show_bug.cgi?id=11774
> >
> > Patch is enclosed.
> >
> > I'll provide backports as soon as a final version is accepted.
>
> OK, took me a lot of staring to understand,
> but I finally did :-).
>
> LGTM. Pushed.
>
>
>
> > From 42e3d35883a78eebf4c765a83d6dc87758595730 Mon Sep 17 00:00:00 2001
> > From: Ira Cooper <ira at samba.org <javascript:;>>
> > Date: Fri, 4 Mar 2016 18:00:07 -0500
> > Subject: [PATCH] vfs_glusterfs: Fix use after free in AIO callback.
> >
> > The wrapper->state pointer is not getting NULLed during free
> > allowing use of freed memory, causing a crash.
> >
> > Thanks to Red Hat for discovering this issue.
> >
> > BUG: https://bugzilla.samba.org/show_bug.cgi?id=11774
> >
> > Signed-off-by: Ira Copper <ira at samba.org <javascript:;>>
> > Reviewed-by: Poornima G <pgurusid at redhat.com <javascript:;>>
> > Tested-by: Christopher Blum <cblum at redhat.com <javascript:;>>
> > ---
> > source3/modules/vfs_glusterfs.c | 15 +++++++--------
> > 1 file changed, 7 insertions(+), 8 deletions(-)
> >
> > diff --git a/source3/modules/vfs_glusterfs.c
> b/source3/modules/vfs_glusterfs.c
> > index c98e480..2008342 100644
> > --- a/source3/modules/vfs_glusterfs.c
> > +++ b/source3/modules/vfs_glusterfs.c
> > @@ -507,7 +507,9 @@ struct glusterfs_aio_state {
> >
> > static int aio_wrapper_destructor(struct glusterfs_aio_wrapper *wrap)
> > {
> > - wrap->state->cancelled = true;
> > + if (wrap->state != NULL) {
> > + wrap->state->cancelled = true;
> > + }
> >
> > return 0;
> > }
> > @@ -744,7 +746,6 @@ static struct tevent_req
> *vfs_gluster_pwrite_send(struct vfs_handle_struct
> > static ssize_t vfs_gluster_recv(struct tevent_req *req,
> > struct vfs_aio_state *vfs_aio_state)
> > {
> > - struct glusterfs_aio_state *state = NULL;
> > struct glusterfs_aio_wrapper *wrapper = NULL;
> > int ret = 0;
> >
> > @@ -754,9 +755,7 @@ static ssize_t vfs_gluster_recv(struct tevent_req
> *req,
> > return -1;
> > }
> >
> > - state = wrapper->state;
> > -
> > - if (state == NULL) {
> > + if (wrapper->state == NULL) {
> > return -1;
> > }
> >
> > @@ -764,12 +763,12 @@ static ssize_t vfs_gluster_recv(struct tevent_req
> *req,
> > return -1;
> > }
> >
> > - *vfs_aio_state = state->vfs_aio_state;
> > - ret = state->ret;
> > + *vfs_aio_state = wrapper->state->vfs_aio_state;
> > + ret = wrapper->state->ret;
> >
> > /* Clean up the state, it is in a NULL context. */
> >
> > - TALLOC_FREE(state);
> > + TALLOC_FREE(wrapper->state);
> >
> > return ret;
> > }
> > --
> > 2.5.0
>
>
Yeah, it becomes real obvious if you fix vts_gluster_recv without making
the other fix. :)
In fact that is how I actually proved what the bug was to myself.
Thanks,
-Ira
More information about the samba-technical
mailing list