XkbCopyKeymap: make sure sym_interpret is always valid

Make sure we're not copying sym_interpret across from an empty source.
This commit is contained in:
Daniel Stone 2006-12-09 22:51:59 +02:00 committed by Daniel Stone
parent d9e079d2a3
commit 329f641727

View File

@ -1497,30 +1497,33 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
return FALSE; return FALSE;
} }
if (src->compat->sym_interpret) { if (src->compat->sym_interpret && src->compat->num_si) {
if (src->compat->size_si != dst->compat->size_si) { if (src->compat->num_si != dst->compat->size_si) {
if (dst->compat->sym_interpret) if (dst->compat->sym_interpret)
tmp = xrealloc(dst->compat->sym_interpret, tmp = xrealloc(dst->compat->sym_interpret,
src->compat->size_si * src->compat->num_si *
sizeof(XkbSymInterpretRec)); sizeof(XkbSymInterpretRec));
else else
tmp = xalloc(src->compat->size_si * tmp = xalloc(src->compat->num_si *
sizeof(XkbSymInterpretRec)); sizeof(XkbSymInterpretRec));
if (!tmp) if (!tmp)
return FALSE; return FALSE;
dst->compat->sym_interpret = tmp; dst->compat->sym_interpret = tmp;
} }
memcpy(dst->compat->sym_interpret, src->compat->sym_interpret, memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
src->compat->size_si * sizeof(XkbSymInterpretRec)); src->compat->num_si * sizeof(XkbSymInterpretRec));
dst->compat->num_si = src->compat->num_si;
dst->compat->size_si = src->compat->num_si;
} }
else { else {
if (dst->compat->sym_interpret) { if (dst->compat->sym_interpret && dst->compat->size_si)
xfree(dst->compat->sym_interpret); xfree(dst->compat->sym_interpret);
dst->compat->sym_interpret = NULL;
} dst->compat->sym_interpret = NULL;
dst->compat->num_si = 0;
dst->compat->size_si = 0;
} }
dst->compat->num_si = src->compat->num_si;
dst->compat->size_si = src->compat->size_si;
memcpy(dst->compat->groups, src->compat->groups, memcpy(dst->compat->groups, src->compat->groups,
XkbNumKbdGroups * sizeof(XkbModsRec)); XkbNumKbdGroups * sizeof(XkbModsRec));