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;
}
if (src->compat->sym_interpret) {
if (src->compat->size_si != dst->compat->size_si) {
if (src->compat->sym_interpret && src->compat->num_si) {
if (src->compat->num_si != dst->compat->size_si) {
if (dst->compat->sym_interpret)
tmp = xrealloc(dst->compat->sym_interpret,
src->compat->size_si *
src->compat->num_si *
sizeof(XkbSymInterpretRec));
else
tmp = xalloc(src->compat->size_si *
tmp = xalloc(src->compat->num_si *
sizeof(XkbSymInterpretRec));
if (!tmp)
return FALSE;
dst->compat->sym_interpret = tmp;
}
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 {
if (dst->compat->sym_interpret) {
if (dst->compat->sym_interpret && dst->compat->size_si)
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,
XkbNumKbdGroups * sizeof(XkbModsRec));