From 898a5835220a3217c7c6909c2d34f6bd0b0837b0 Mon Sep 17 00:00:00 2001 From: John Lindgren Date: Sat, 17 Sep 2022 14:47:47 -0400 Subject: [PATCH] keyboard: Fix SIGSEGV that showed up in out-of-memory fuzzing Stack trace: #0 xkb_keymap_ref (keymap=keymap@entry=0x0) at ../libxkbcommon/src/keymap.c:61 #1 0x00007f53a344ab99 in wlr_keyboard_set_keymap (kb=kb@entry=0x5571af8cb9a0, keymap=keymap@entry=0x0) at ../types/wlr_keyboard.c:174 #2 0x00005571ade057e0 in keyboard_init (seat=0x7ffca0389680) at ../src/keyboard.c:229 #3 seat_init (server=0x7ffca0389570) at ../src/seat.c:307 #4 server_init (server=0x7ffca0389570) at ../src/server.c:308 --- src/keyboard.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 364e8048..2f0dd66d 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -226,8 +226,12 @@ keyboard_init(struct seat *seat) struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); struct xkb_keymap *keymap = xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); - wlr_keyboard_set_keymap(kb, keymap); - xkb_keymap_unref(keymap); + if (keymap) { + wlr_keyboard_set_keymap(kb, keymap); + xkb_keymap_unref(keymap); + } else { + wlr_log(WLR_ERROR, "Failed to create xkb keymap"); + } xkb_context_unref(context); wlr_keyboard_set_repeat_info(kb, rc.repeat_rate, rc.repeat_delay);