[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