XkbCopyKeymap: always initialise map and preserve

If we don't have map or preserve in the source map, make sure the
destination is initialised to NULL, and freed if it's a valid type.
This commit is contained in:
Daniel Stone 2006-12-08 21:31:47 +02:00 committed by Daniel Stone
parent e59aeac1ff
commit ec84f72d07

View File

@ -1144,6 +1144,11 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
memcpy(dtype->map, stype->map, memcpy(dtype->map, stype->map,
stype->map_count * sizeof(XkbKTMapEntryRec)); stype->map_count * sizeof(XkbKTMapEntryRec));
} }
else {
if (dtype->map && i < dst->map->num_types)
xfree(dtype->map);
dtype->map = NULL;
}
if (stype->preserve) { if (stype->preserve) {
if (stype->map_count != dtype->map_count && if (stype->map_count != dtype->map_count &&
@ -1168,17 +1173,22 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
memcpy(dtype->preserve, stype->preserve, memcpy(dtype->preserve, stype->preserve,
stype->map_count * sizeof(XkbModsRec)); stype->map_count * sizeof(XkbModsRec));
} }
else {
if (dtype->preserve && i < dst->map->num_types)
xfree(dtype->preserve);
dtype->preserve = NULL;
}
dtype->map_count = stype->map_count; dtype->map_count = stype->map_count;
} }
else { else {
if (dtype->map_count) { if (dtype->map_count && i < dst->map->num_types) {
if (dtype->map) if (dtype->map)
xfree(dtype->map); xfree(dtype->map);
if (dtype->preserve) if (dtype->preserve)
xfree(dtype->preserve); xfree(dtype->preserve);
dtype->map_count = 0;
} }
dtype->map_count = 0;
dtype->map = NULL; dtype->map = NULL;
dtype->preserve = NULL; dtype->preserve = NULL;
} }