[PATCH 4/5] libXi: Use single error path in XGetFeedbackControl

Julien Cristau jcristau at debian.org
Thu Jun 17 09:01:28 PDT 2010


On Mon, Jun 14, 2010 at 11:47:34 +0300, Pauli Nieminen wrote:

> This reduces code duplication and fixes possible leak of f. f would leak if
> allocation of Feedback fails.
> 
> Signed-off-by: Pauli Nieminen <ext-pauli.nieminen at nokia.com>
> ---
>  src/XGetFCtl.c |   23 +++++++++--------------
>  1 files changed, 9 insertions(+), 14 deletions(-)
> 
> diff --git a/src/XGetFCtl.c b/src/XGetFCtl.c
> index 61df7cf..3d64404 100644
> --- a/src/XGetFCtl.c
> +++ b/src/XGetFCtl.c
> @@ -83,20 +83,16 @@ XGetFeedbackControl(
>      req->ReqType = X_GetFeedbackControl;
>      req->deviceid = dev->device_id;
>  
> -    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
> -	UnlockDisplay(dpy);
> -	SyncHandle();
> -	return (XFeedbackState *) NULL;
> -    }
> +    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
> +	goto out;
> +
>      if (rep.length > 0) {
>  	*num_feedbacks = rep.num_feedbacks;
>  	nbytes = (long)rep.length << 2;
>  	f = (xFeedbackState *) Xmalloc((unsigned)nbytes);
>  	if (!f) {
>  	    _XEatData(dpy, (unsigned long)nbytes);
> -	    UnlockDisplay(dpy);
> -	    SyncHandle();
> -	    return (XFeedbackState *) NULL;
> +	    goto out;
>  	}
>  	sav = f;
>  	_XRead(dpy, (char *)f, nbytes);
> @@ -134,11 +130,9 @@ XGetFeedbackControl(
>  	}
>  
>  	Feedback = (XFeedbackState *) Xmalloc((unsigned)size);
> -	if (!Feedback) {
> -	    UnlockDisplay(dpy);
> -	    SyncHandle();
> -	    return (XFeedbackState *) NULL;
> -	}
> +	if (!Feedback)
> +	    goto out;
> +
>  	Sav = Feedback;
>  
>  	f = sav;
> @@ -253,8 +247,9 @@ XGetFeedbackControl(
>  	    f = (xFeedbackState *) ((char *)f + f->length);
>  	    Feedback = (XFeedbackState *) ((char *)Feedback + Feedback->length);
>  	}
> -	XFree((char *)sav);
>      }
> +out:
> +    XFree((char *)sav);
>  
>      UnlockDisplay(dpy);
>      SyncHandle();

You could drop the cast for XFree(), since it takes a void *, but
regardless,

Reviewed-by: Julien Cristau <jcristau at debian.org>

Cheers,
Julien


More information about the xorg-devel mailing list