From 5c47f8beac7f87680c6f7331483b9cf94a1dbc86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rami=20Ylim=C3=A4ki?= Date: Fri, 11 Mar 2011 14:30:49 +0200 Subject: [PATCH] xkb: Release XKB component names when compiling keymap. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Erkki Seppälä Signed-off-by: Rami Ylimäki Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- include/xkbsrv.h | 5 +++++ xkb/XKBAlloc.c | 19 +++++++++++++++++++ xkb/ddxLoad.c | 22 +++++++++++----------- xkb/xkb.c | 11 +---------- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/include/xkbsrv.h b/include/xkbsrv.h index 422bae014..c6f86f544 100644 --- a/include/xkbsrv.h +++ b/include/xkbsrv.h @@ -447,6 +447,11 @@ extern _X_EXPORT void XkbFreeKeyboard( Bool /* freeDesc */ ); +extern _X_EXPORT void XkbFreeComponentNames( + XkbComponentNamesPtr /* names */, + Bool /* freeNames */ +); + extern _X_EXPORT void XkbSetActionKeyMods( XkbDescPtr /* xkb */, XkbAction * /* act */, diff --git a/xkb/XKBAlloc.c b/xkb/XKBAlloc.c index bffd60fce..b70ac1705 100644 --- a/xkb/XKBAlloc.c +++ b/xkb/XKBAlloc.c @@ -333,3 +333,22 @@ XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll) free(xkb); return; } + + +/***====================================================================***/ + +void +XkbFreeComponentNames(XkbComponentNamesPtr names, Bool freeNames) +{ + if (names) + { + free(names->keycodes); + free(names->types); + free(names->compat); + free(names->symbols); + free(names->geometry); + memset(names, 0, sizeof(XkbComponentNamesRec)); + } + if (freeNames) + free(names); +} diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c index dc3c844c9..e1020358a 100644 --- a/xkb/ddxLoad.c +++ b/xkb/ddxLoad.c @@ -447,23 +447,23 @@ XkbRMLVOtoKcCGST(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbComponentNamesPtr kccg static XkbDescPtr XkbCompileKeymapForDevice(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, int need) { - XkbDescPtr xkb; + XkbDescPtr xkb = NULL; unsigned int provided; - XkbComponentNamesRec kccgst; + XkbComponentNamesRec kccgst = {0}; char name[PATH_MAX]; - if (!XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) - return NULL; - - provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need, - &xkb, name, PATH_MAX); - if ((need & provided) != need) { - if (xkb) { - XkbFreeKeyboard(xkb, 0, TRUE); - xkb = NULL; + if (XkbRMLVOtoKcCGST(dev, rmlvo, &kccgst)) { + provided = XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, need, + &xkb, name, PATH_MAX); + if ((need & provided) != need) { + if (xkb) { + XkbFreeKeyboard(xkb, 0, TRUE); + xkb = NULL; + } } } + XkbFreeComponentNames(&kccgst, FALSE); return xkb; } diff --git a/xkb/xkb.c b/xkb/xkb.c index d701ea13c..fb44b24e9 100644 --- a/xkb/xkb.c +++ b/xkb/xkb.c @@ -5895,16 +5895,7 @@ ProcXkbGetKbdByName(ClientPtr client) XkbFreeKeyboard(new,XkbAllComponentsMask,TRUE); new= NULL; } - free(names.keycodes); - names.keycodes = NULL; - free(names.types); - names.types = NULL; - free(names.compat); - names.compat = NULL; - free(names.symbols); - names.symbols = NULL; - free(names.geometry); - names.geometry = NULL; + XkbFreeComponentNames(&names, FALSE); return Success; }