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>
This commit is contained in:
parent
b406886bbf
commit
56a5955c8c
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user