From 329f6417275bb1201ba66c29b202028eeab3a355 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sat, 9 Dec 2006 22:51:59 +0200 Subject: [PATCH] XkbCopyKeymap: make sure sym_interpret is always valid Make sure we're not copying sym_interpret across from an empty source. --- xkb/xkbUtils.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index c9c5ed018..400306a22 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -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));