input: Add null checks 64/280764/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 5 Sep 2022 02:06:46 +0000 (11:06 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Mon, 5 Sep 2022 02:13:46 +0000 (11:13 +0900)
This adds null checks for xkb_context and xkb_keymap, also makes a
function for setting keymap for ds_keyboard.

Change-Id: If20e115c20491cf27e1a21a7fa77f15b97176a55

src/input/input.c

index bdc8a3f..43f3652 100644 (file)
@@ -82,6 +82,7 @@ static void handle_top_view_destroy(struct wl_listener *listener, void *data);
 static headless_keyboard_t *create_keyboard(headless_input_t *input,
                struct ds_input_device *dev);
 static void keyboard_destroy(headless_keyboard_t *keyboard);
+static bool keyboard_set_keymap(headless_keyboard_t *keyboard);
 static void keyboard_handle_destroy(struct wl_listener *listener, void *data);
 static void keyboard_handle_key(struct wl_listener *listener, void *data);
 static void devicemgr_set_keymap(struct ds_tizen_input_devicemgr *devicemgr);
@@ -256,9 +257,6 @@ static headless_keyboard_t *
 create_keyboard(headless_input_t *input, struct ds_input_device *dev)
 {
        headless_keyboard_t *keyboard;
-       struct ds_keyboard *ds_keyboard;
-       struct xkb_context *context;
-       struct xkb_keymap *keymap;
 
        keyboard = calloc(1, sizeof *keyboard);
        if (!keyboard) {
@@ -269,21 +267,18 @@ create_keyboard(headless_input_t *input, struct ds_input_device *dev)
        keyboard->input = input;
        keyboard->dev = dev;
 
+       if (!keyboard_set_keymap(keyboard)) {
+               ds_err("Could not set keymap for ds_keyboard");
+               free(keyboard);
+               return NULL;
+       }
+
        keyboard->device_destroy.notify = keyboard_handle_destroy;
        ds_input_device_add_destroy_listener(dev, &keyboard->device_destroy);
 
-       ds_keyboard = ds_input_device_get_keyboard(dev);
-
        keyboard->key.notify = keyboard_handle_key;
-       ds_keyboard_add_key_listener(ds_keyboard, &keyboard->key);
-
-       context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
-       keymap = xkb_keymap_new_from_names(context, NULL,
-                       XKB_KEYMAP_COMPILE_NO_FLAGS);
-
-       ds_keyboard_set_keymap(ds_keyboard, keymap);
-       xkb_keymap_unref(keymap);
-       xkb_context_unref(context);
+       ds_keyboard_add_key_listener(ds_input_device_get_keyboard(dev),
+                       &keyboard->key);
 
        ds_inf("Input(%p): New keyboard(%p)", input, keyboard);
 
@@ -300,6 +295,34 @@ keyboard_destroy(headless_keyboard_t *keyboard)
        free(keyboard);
 }
 
+static bool
+keyboard_set_keymap(headless_keyboard_t *keyboard)
+{
+       struct xkb_context *context;
+       struct xkb_keymap *keymap;
+
+       context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+       if (!context) {
+               ds_err("Could not create xkb_context");
+               return false;
+       }
+
+       keymap = xkb_keymap_new_from_names(context, NULL,
+                       XKB_KEYMAP_COMPILE_NO_FLAGS);
+       if (!keymap) {
+               ds_err("Could not create xkb_keymap");
+               xkb_context_unref(context);
+               return false;
+       }
+       ds_keyboard_set_keymap(ds_input_device_get_keyboard(keyboard->dev),
+                       keymap);
+
+       xkb_keymap_unref(keymap);
+       xkb_context_unref(context);
+
+       return true;
+}
+
 static void
 keyboard_handle_destroy(struct wl_listener *listener, void *data)
 {