summaryrefslogtreecommitdiff
path: root/clients/keyboard.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2014-01-09 23:45:18 -0800
committerKristian Høgsberg <krh@bitplanet.net>2014-01-09 23:45:18 -0800
commit700d6ad071614895c3cb305b894b8c1a003db39e (patch)
tree8ebefd3bd2f3e06aa7662ee98bef07352fe969b5 /clients/keyboard.c
parenta548b4b85cfdbef103f622c3e3aaf976938535f9 (diff)
keyboard: Don't strcat() into a strdup()ed string
We need to reallocate the memory to hold the entire concatenated string, but strcat() doesn't do that. Closes: https://bugs.freedesktop.org/show_bug.cgi?id=71750
Diffstat (limited to 'clients/keyboard.c')
-rw-r--r--clients/keyboard.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/clients/keyboard.c b/clients/keyboard.c
index 963382c1..b9778a7b 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -490,6 +490,21 @@ delete_before_cursor(struct virtual_keyboard *keyboard)
memmove(keyboard->surrounding_text + keyboard->surrounding_cursor, end, strlen(end));
}
+static char *
+append(char *s1, const char *s2)
+{
+ int len1, len2;
+ char *s;
+
+ len1 = strlen(s1);
+ len2 = strlen(s2);
+ s = xrealloc(s1, len1 + len2 + 1);
+ memcpy(s + len1, s2, len2);
+ s[len1 + len2] = '\0';
+
+ return s;
+}
+
static void
keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *key, struct input *input, enum wl_pointer_button_state state)
{
@@ -502,8 +517,9 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
if (state != WL_POINTER_BUTTON_STATE_PRESSED)
break;
- keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string,
- label);
+ keyboard->keyboard->preedit_string =
+ append(keyboard->keyboard->preedit_string,
+ label);
virtual_keyboard_send_preedit(keyboard->keyboard, -1);
break;
case keytype_backspace:
@@ -527,8 +543,8 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
case keytype_space:
if (state != WL_POINTER_BUTTON_STATE_PRESSED)
break;
- keyboard->keyboard->preedit_string = strcat(keyboard->keyboard->preedit_string,
- " ");
+ keyboard->keyboard->preedit_string =
+ append(keyboard->keyboard->preedit_string, " ");
virtual_keyboard_commit_preedit(keyboard->keyboard);
break;
case keytype_switch: