[PATCH] Xext: Fix a memory leak on GE client disconnect.

Oliver McFadden oliver.mcfadden at nokia.com
Thu Nov 5 07:39:53 PST 2009


On Thu, 2009-11-05 at 16:29 +0100, Ylimaki Rami (EXT-Vincit/Tampere)
wrote:
> Add a call to dixRequestPrivate to inform dixFreePrivates that memory
> allocated in GEClientCallback should be released when client
> disconnects. Otherwise there is a leak of sizeof(GEClientInfoRec) for
> every client connect/disconnect.
> 
> Also remove the explicit allocation and let GEGetClient /
> dixLookupPrivate do it. This makes GEClientCallback similar to the
> other extension callbacks.
> 
> Signed-off-by: Rami Ylimaki <ext-rami.ylimaki at nokia.com>
> ---
> Please note that I have only tested a modified version of this patch
> with 1.6.99.1. However, this fix seems to be valid for master
> also. The only difference between the tested patch and this patch is
> that this one has been modified to apply cleanly on master.
> 
>  Xext/geext.c |    9 +++------
>  1 files changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/Xext/geext.c b/Xext/geext.c
> index 6fad4ae..0c7f59d 100644
> --- a/Xext/geext.c
> +++ b/Xext/geext.c
> @@ -168,12 +168,6 @@ GEClientCallback(CallbackListPtr *list,
>      ClientPtr		pClient = clientinfo->client;
>      GEClientInfoPtr     pGEClient = GEGetClient(pClient);
>  
> -    if (pGEClient == NULL)
> -    {
> -        pGEClient = xcalloc(1, sizeof(GEClientInfoRec));
> -        dixSetPrivate(&pClient->devPrivates, GEClientPrivateKey, pGEClient);
> -    }
> -
>      pGEClient->major_version = 0;
>      pGEClient->minor_version = 0;
>  }
> @@ -222,6 +216,9 @@ GEExtensionInit(void)
>  {
>      ExtensionEntry *extEntry;
>  
> +    if (!dixRequestPrivate(GEClientPrivateKey, sizeof(GEClientInfoRec)))
> +        FatalError("Cannot request private for GE.\n");

Nothing major, but you might want to change this FatalError to match the
format below, eg:

FatalError("GEExtensionInit: GE private request failed.\n");

> +
>      if(!AddCallback(&ClientStateCallback, GEClientCallback, 0))
>      {
>          FatalError("GEExtensionInit: register client callback failed.\n");



More information about the xorg-devel mailing list