[PATCH 7/9] dri2: Send events only to known clients

Pauli Nieminen ext-pauli.nieminen at nokia.com
Fri Feb 4 05:39:07 PST 2011


On 04/02/11 13:34 +1100, ext Christopher James Halse Rogers wrote:
> On Thu, 2011-02-03 at 19:48 +0200, Pauli wrote:
> > From: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
> > 
> > If client disconnects and new client gets same id DRI2 events may end to
> > wrong client. DRI2 reference list can be checked to see if the client
> > still owns the DRI2Drawable.
> > 
> > Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
> > ---
> >  hw/xfree86/dri2/dri2.c |   25 +++++++++++++++++--------
> >  1 files changed, 17 insertions(+), 8 deletions(-)
> > 
> > diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> > index b50206e..12c1f72 100644
> > --- a/hw/xfree86/dri2/dri2.c
> > +++ b/hw/xfree86/dri2/dri2.c
> > @@ -255,7 +255,8 @@ DRI2LookupClientDrawableRef(DRI2DrawablePtr pPriv, ClientPtr client, XID id)
> >      DRI2DrawableRefPtr ref;
> >  
> >      list_for_each_entry(ref, &pPriv->reference_list, link) {
> > -	if (CLIENT_ID(ref->dri2_id) == client->index && ref->id == id)
> > +	if (CLIENT_ID(ref->dri2_id) == client->index &&
> 
> If the client has gone then this isn't this a potential use-after-free?
> 


Good catch. I have to fix that one.

> > +		(id == 0 || ref->id == id))
> >  	    return ref;
> >      }
> >      return NULL;
> > @@ -739,21 +740,24 @@ void
> >  DRI2WaitMSCComplete(ClientPtr client, DRI2DrawablePtr pPriv, int frame,
> >  		    unsigned int tv_sec, unsigned int tv_usec)
> >  {
> > +    DRI2DrawableRefPtr ref = DRI2LookupClientDrawableRef(pPriv, client, 0);
> > +    ClientPtr blockedClient = pPriv->blockedClient;
> > +
> > +    pPriv->blockedClient = NULL;
> > +    pPriv->blockedOnMsc = FALSE;
> >      pPriv->refcnt--;
> >  
> > -    if (pPriv->refcnt == 0) {
> > -	DRI2DrawableGone(pPriv, 0);
> > +    if (ref == NULL) {
> > +	if (pPriv->refcnt == 0)
> > +	    DRI2DrawableGone(pPriv, 0);
> >  	return;
> >      }
> >  
> >      ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
> >  			 frame, pPriv->swap_count);
> >  
> > -    if (pPriv->blockedClient)
> > -	AttendClient(pPriv->blockedClient);
> > -
> > -    pPriv->blockedClient = NULL;
> > -    pPriv->blockedOnMsc = FALSE;
> > +    if (blockedClient)
> > +	AttendClient(blockedClient);
> >  }
> >  
> >  static void
> > @@ -806,6 +810,7 @@ DRI2SwapComplete(ClientPtr client, DRI2DrawablePtr pPriv, int frame,
> >  		   DRI2SwapEventPtr swap_complete, void *swap_data)
> >  {
> >      DRI2SwapCompleteDataPtr pSwapData = swap_data;
> > +    DRI2DrawableRefPtr ref = DRI2LookupClientDrawableRef(pPriv, client, 0);
> >      DrawablePtr     pDraw = pPriv->drawable;
> >      CARD64          ust = 0;
> >  
> > @@ -813,6 +818,9 @@ DRI2SwapComplete(ClientPtr client, DRI2DrawablePtr pPriv, int frame,
> >      pPriv->swap_count++;
> >      pPriv->refcnt--;
> >  
> > +    if (ref == NULL)
> > +	goto out;
> > +
> >      if (pDraw) {
> >  	BoxRec          box;
> >  	RegionRec       region;
> > @@ -836,6 +844,7 @@ DRI2SwapComplete(ClientPtr client, DRI2DrawablePtr pPriv, int frame,
> >  
> >      DRI2WakeClient(client, pPriv, frame, tv_sec, tv_usec);
> >  
> > +out:
> >      free_swap_complete_data(pPriv, pSwapData);
> >  
> >      if (pPriv->refcnt == 0)
> 
> 




More information about the xorg-devel mailing list