xkb: ProcXkbGetGeometry(): fix memleak
If XkbComputeGetGeometryReplySize() returns an error, the XkbGeometryRec won't be freed, since we're bailing out too early and not calling XkbSendGeometry(). Having XkbSendGeometry() responsible for freeing that struct is unnecessarily complicated anyways, so move that to ProcXkbGetGeometry() and do it also when XkbComputeGetGeometryReplySize() failed. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net> Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1622>
This commit is contained in:
parent
66f5e7e96a
commit
b2198df55a
18
xkb/xkb.c
18
xkb/xkb.c
|
@ -5033,7 +5033,7 @@ XkbComputeGetGeometryReplySize(XkbGeometryPtr geom,
|
||||||
}
|
}
|
||||||
static int
|
static int
|
||||||
XkbSendGeometry(ClientPtr client,
|
XkbSendGeometry(ClientPtr client,
|
||||||
XkbGeometryPtr geom, xkbGetGeometryReply * rep, Bool freeGeom)
|
XkbGeometryPtr geom, xkbGetGeometryReply *rep)
|
||||||
{
|
{
|
||||||
char *desc, *start;
|
char *desc, *start;
|
||||||
int len;
|
int len;
|
||||||
|
@ -5085,8 +5085,6 @@ XkbSendGeometry(ClientPtr client,
|
||||||
WriteToClient(client, len, start);
|
WriteToClient(client, len, start);
|
||||||
if (start != NULL)
|
if (start != NULL)
|
||||||
free((char *) start);
|
free((char *) start);
|
||||||
if (freeGeom)
|
|
||||||
XkbFreeGeometry(geom, XkbGeomAllMask, TRUE);
|
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5117,9 +5115,15 @@ ProcXkbGetGeometry(ClientPtr client)
|
||||||
};
|
};
|
||||||
status = XkbComputeGetGeometryReplySize(geom, &rep, stuff->name);
|
status = XkbComputeGetGeometryReplySize(geom, &rep, stuff->name);
|
||||||
if (status != Success)
|
if (status != Success)
|
||||||
return status;
|
goto free_out;
|
||||||
else
|
|
||||||
return XkbSendGeometry(client, geom, &rep, shouldFree);
|
status = XkbSendGeometry(client, geom, &rep);
|
||||||
|
|
||||||
|
free_out:
|
||||||
|
if (shouldFree)
|
||||||
|
XkbFreeGeometry(geom, XkbGeomAllMask, TRUE);
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***====================================================================***/
|
/***====================================================================***/
|
||||||
|
@ -6193,7 +6197,7 @@ ProcXkbGetKbdByName(ClientPtr client)
|
||||||
if (reported & (XkbGBN_KeyNamesMask | XkbGBN_OtherNamesMask))
|
if (reported & (XkbGBN_KeyNamesMask | XkbGBN_OtherNamesMask))
|
||||||
XkbSendNames(client, new, &nrep);
|
XkbSendNames(client, new, &nrep);
|
||||||
if (reported & XkbGBN_GeometryMask)
|
if (reported & XkbGBN_GeometryMask)
|
||||||
XkbSendGeometry(client, new->geom, &grep, FALSE);
|
XkbSendGeometry(client, new->geom, &grep);
|
||||||
if (rep.loaded) {
|
if (rep.loaded) {
|
||||||
XkbDescPtr old_xkb;
|
XkbDescPtr old_xkb;
|
||||||
xkbNewKeyboardNotify nkn;
|
xkbNewKeyboardNotify nkn;
|
||||||
|
|
Loading…
Reference in New Issue