Return Success from generate_modkeymap() when max_keys_per_mod is zero

max_keys_per_mod equal to zero is a valid situation so generate_modkeymap
should not return BadAlloc in this case.

Signed-off-by: Adam Tkac <atkac@redhat.com>
Reviewed-by: Patrick E. Kane <pekane52 at gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Adam Tkac 2010-08-25 10:38:40 +02:00 committed by Peter Hutterer
parent 4a12aecac6
commit 05e616767e

View File

@ -286,7 +286,7 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
{ {
CARD8 keys_per_mod[8]; CARD8 keys_per_mod[8];
int max_keys_per_mod; int max_keys_per_mod;
KeyCode *modkeymap; KeyCode *modkeymap = NULL;
int i, j, ret; int i, j, ret;
ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess); ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
@ -310,18 +310,20 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
} }
} }
modkeymap = calloc(max_keys_per_mod * 8, sizeof(KeyCode)); if (max_keys_per_mod != 0) {
if (!modkeymap) modkeymap = calloc(max_keys_per_mod * 8, sizeof(KeyCode));
return BadAlloc; if (!modkeymap)
return BadAlloc;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
keys_per_mod[i] = 0; keys_per_mod[i] = 0;
for (i = 8; i < MAP_LENGTH; i++) { for (i = 8; i < MAP_LENGTH; i++) {
for (j = 0; j < 8; j++) { for (j = 0; j < 8; j++) {
if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) { if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i; modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
keys_per_mod[j]++; keys_per_mod[j]++;
}
} }
} }
} }