diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-04-14 17:05:04 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-04-17 10:04:28 +1000 |
commit | 56a5955c8cd87137248edb2cbc65d384376d72ad (patch) | |
tree | 523ebcbb79e7d79fb50bf77e591bbd92dbf3452a /xkb | |
parent | b406886bbffadaa52864a99f2a0520999eadc15d (diff) |
xkb: strdup the values returned by XkbGetRulesDflts
XkbGetRulesDftls may get a copy of what will later be freed when passed into
XkbSetRulesDftls.
On the second run of XkbGet/SetRulesDflts:
XkbGetRulesDflts(rmlvo)
rmlvo->rules = current-rules
XkbSetRulesDflts(rmlvo)
free(current-rules)
current-rules = strdup(rmlvo->rules)
Leaving us with garbage in current-rules.
This patch requires callers of XkbGetRulesDflts to free the associated memory.
See also
http://lists.freedesktop.org/archives/xorg-devel/2009-February/000305.html
Reported-by: Benjamin Close <Benjamin.Close@clearchain.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Benjamin Close <Benjamin.Close@clearchain.com>
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
Diffstat (limited to 'xkb')
-rw-r--r-- | xkb/xkbInit.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c index 2e7561294..9d4d9a212 100644 --- a/xkb/xkbInit.c +++ b/xkb/xkbInit.c @@ -111,6 +111,10 @@ static Bool XkbWantRulesProp= XKB_DFLT_RULES_PROP; /***====================================================================***/ +/** + * Get the current default XKB rules. + * Caller must free the data in rmlvo. + */ void XkbGetRulesDflts(XkbRMLVOSet *rmlvo) { @@ -124,6 +128,12 @@ XkbGetRulesDflts(XkbRMLVOSet *rmlvo) else rmlvo->variant= XKB_DFLT_VARIANT; if (XkbOptionsDflt) rmlvo->options= XkbOptionsDflt; else rmlvo->options= XKB_DFLT_OPTIONS; + + rmlvo->rules = strdup(rmlvo->rules); + rmlvo->model = strdup(rmlvo->model); + rmlvo->layout = strdup(rmlvo->layout); + rmlvo->variant = strdup(rmlvo->variant); + rmlvo->options = strdup(rmlvo->options); } static Bool @@ -586,6 +596,17 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, XkbSetRulesDflts(rmlvo); XkbSetRulesUsed(rmlvo); + if (rmlvo_dflts.rules) + xfree(rmlvo_dflts.rules); + if (rmlvo_dflts.model) + xfree(rmlvo_dflts.model); + if (rmlvo_dflts.layout) + xfree(rmlvo_dflts.layout); + if (rmlvo_dflts.variant) + xfree(rmlvo_dflts.variant); + if (rmlvo_dflts.options) + xfree(rmlvo_dflts.options); + return TRUE; unwind_desc: |