[PATCH 7/9] dri2: Send events only to known clients
Christopher James Halse Rogers
christopher.halse.rogers at canonical.com
Thu Feb 3 18:34:10 PST 2011
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?
> + (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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: This is a digitally signed message part
URL: <http://lists.x.org/archives/xorg-devel/attachments/20110204/8a757c69/attachment-0001.pgp>
More information about the xorg-devel
mailing list