mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-02-15 09:10:37 +01:00
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>
(cherry picked from commit b2198df55a)
This commit is contained in:
parent
47c4e38e50
commit
6d7eaaf6e1
1 changed files with 11 additions and 7 deletions
18
xkb/xkb.c
18
xkb/xkb.c
|
|
@ -5030,7 +5030,7 @@ XkbComputeGetGeometryReplySize(XkbGeometryPtr geom,
|
|||
}
|
||||
static int
|
||||
XkbSendGeometry(ClientPtr client,
|
||||
XkbGeometryPtr geom, xkbGetGeometryReply * rep, Bool freeGeom)
|
||||
XkbGeometryPtr geom, xkbGetGeometryReply *rep)
|
||||
{
|
||||
char *desc, *start;
|
||||
int len;
|
||||
|
|
@ -5082,8 +5082,6 @@ XkbSendGeometry(ClientPtr client,
|
|||
WriteToClient(client, len, start);
|
||||
if (start != NULL)
|
||||
free((char *) start);
|
||||
if (freeGeom)
|
||||
XkbFreeGeometry(geom, XkbGeomAllMask, TRUE);
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
|
@ -5114,9 +5112,15 @@ ProcXkbGetGeometry(ClientPtr client)
|
|||
};
|
||||
status = XkbComputeGetGeometryReplySize(geom, &rep, stuff->name);
|
||||
if (status != Success)
|
||||
return status;
|
||||
else
|
||||
return XkbSendGeometry(client, geom, &rep, shouldFree);
|
||||
goto free_out;
|
||||
|
||||
status = XkbSendGeometry(client, geom, &rep);
|
||||
|
||||
free_out:
|
||||
if (shouldFree)
|
||||
XkbFreeGeometry(geom, XkbGeomAllMask, TRUE);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/***====================================================================***/
|
||||
|
|
@ -6190,7 +6194,7 @@ ProcXkbGetKbdByName(ClientPtr client)
|
|||
if (reported & (XkbGBN_KeyNamesMask | XkbGBN_OtherNamesMask))
|
||||
XkbSendNames(client, new, &nrep);
|
||||
if (reported & XkbGBN_GeometryMask)
|
||||
XkbSendGeometry(client, new->geom, &grep, FALSE);
|
||||
XkbSendGeometry(client, new->geom, &grep);
|
||||
if (rep.loaded) {
|
||||
XkbDescPtr old_xkb;
|
||||
xkbNewKeyboardNotify nkn;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue