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 <[email protected]> > --- > 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 <[email protected]> Cheers, Julien _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
