diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2022-07-13 11:23:09 +1000 |
---|---|---|
committer | Olivier Fourdan <ofourdan@redhat.com> | 2022-12-14 12:27:17 +0100 |
commit | 69ab3bcaa0f6a5adef6ec19161eb856a4744b32c (patch) | |
tree | 941d4289634effd0181dca7b8d32a1db906bb172 | |
parent | 5dbb2b52cfeab212b5c9b7e344692a6384efdc4c (diff) | |
download | xserver-69ab3bcaa0f6a5adef6ec19161eb856a4744b32c.tar.gz |
xkb: fix some possible memleaks in XkbGetKbdByName
GetComponentByName returns an allocated string, so let's free that if we
fail somewhere.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 18f91b950e22c2a342a4fbc55e9ddf7534a707d2)
-rw-r--r-- | xkb/xkb.c | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -5940,18 +5940,32 @@ ProcXkbGetKbdByName(ClientPtr client) xkb = dev->key->xkbInfo->desc; status = Success; str = (unsigned char *) &stuff[1]; - if (GetComponentSpec(&str, TRUE, &status)) /* keymap, unsupported */ - return BadMatch; + { + char *keymap = GetComponentSpec(&str, TRUE, &status); /* keymap, unsupported */ + if (keymap) { + free(keymap); + return BadMatch; + } + } names.keycodes = GetComponentSpec(&str, TRUE, &status); names.types = GetComponentSpec(&str, TRUE, &status); names.compat = GetComponentSpec(&str, TRUE, &status); names.symbols = GetComponentSpec(&str, TRUE, &status); names.geometry = GetComponentSpec(&str, TRUE, &status); - if (status != Success) + if (status == Success) { + len = str - ((unsigned char *) stuff); + if ((XkbPaddedSize(len) / 4) != stuff->length) + status = BadLength; + } + + if (status != Success) { + free(names.keycodes); + free(names.types); + free(names.compat); + free(names.symbols); + free(names.geometry); return status; - len = str - ((unsigned char *) stuff); - if ((XkbPaddedSize(len) / 4) != stuff->length) - return BadLength; + } CHK_MASK_LEGAL(0x01, stuff->want, XkbGBN_AllComponentsMask); CHK_MASK_LEGAL(0x02, stuff->need, XkbGBN_AllComponentsMask); |