summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-04-14 17:05:04 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-04-17 10:04:28 +1000
commit56a5955c8cd87137248edb2cbc65d384376d72ad (patch)
tree523ebcbb79e7d79fb50bf77e591bbd92dbf3452a
parentb406886bbffadaa52864a99f2a0520999eadc15d (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>
-rw-r--r--xkb/xkbInit.c21
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: