diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c index 227246cc92..43f31552cd 100644 --- a/src/video/wayland/SDL_waylandevents.c +++ b/src/video/wayland/SDL_waylandevents.c @@ -1591,9 +1591,18 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, seat->keyboard.xkb.num_layouts = WAYLAND_xkb_keymap_num_layouts(seat->keyboard.xkb.keymap); if (seat->keyboard.xkb.num_layouts) { seat->keyboard.sdl_keymap = SDL_calloc(seat->keyboard.xkb.num_layouts, sizeof(SDL_Keymap *)); + if (!seat->keyboard.sdl_keymap) { + return; + } + for (xkb_layout_index_t i = 0; i < seat->keyboard.xkb.num_layouts; ++i) { seat->keyboard.sdl_keymap[i] = SDL_CreateKeymap(false); - if (!seat->keyboard.sdl_keymap) { + if (!seat->keyboard.sdl_keymap[i]) { + for (xkb_layout_index_t j = 0; j < i; ++j) { + SDL_DestroyKeymap(seat->keyboard.sdl_keymap[j]); + } + SDL_free(seat->keyboard.sdl_keymap); + seat->keyboard.sdl_keymap = NULL; return; } } @@ -2095,7 +2104,7 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, Wayland_HandleModifierKeys(seat, scancode, state == WL_KEYBOARD_KEY_STATE_PRESSED); // If we have a key with unknown scancode, check if the keysym corresponds to a valid Unicode value, and assign it a reserved scancode. - if (scancode == SDL_SCANCODE_UNKNOWN && syms) { + if (scancode == SDL_SCANCODE_UNKNOWN && syms && seat->keyboard.sdl_keymap) { const SDL_Keycode keycode = (SDL_Keycode)SDL_KeySymToUcs4(syms[0]); if (keycode != SDLK_UNKNOWN) { SDL_Keymod modstate = SDL_KMOD_NONE;