diff --git a/ChangeLog b/ChangeLog index 52b3d6d3c..b7b30af6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,8 @@ v0.3.6-dev, 2011-08-02 Version 0.3.6 (under dev!) -------------------------- +* core: fix crash when invalid UTF-8 chars are inserted in command line + (bug #33471) * core: stop horizontal bar scroll at the end of content (for bars with horizontal filling) (bug #27908) * core: fix crash when building hashtable string with keys and values diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 072df0368..e8cfb0a70 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -81,21 +81,30 @@ void gui_input_replace_input (struct t_gui_buffer *buffer, const char *new_input) { int size, length; + char *input_utf8; - size = strlen (new_input); - length = utf8_strlen (new_input); - - /* compute new buffer size */ - buffer->input_buffer_size = size; - buffer->input_buffer_length = length; - gui_input_optimize_size (buffer); - - /* copy new string to input */ - strcpy (buffer->input_buffer, new_input); - - /* move cursor to the end of new input if it is now after the end */ - if (buffer->input_buffer_pos > buffer->input_buffer_length) - buffer->input_buffer_pos = buffer->input_buffer_length; + input_utf8 = strdup (new_input); + if (input_utf8) + { + utf8_normalize (input_utf8, '?'); + + size = strlen (input_utf8); + length = utf8_strlen (input_utf8); + + /* compute new buffer size */ + buffer->input_buffer_size = size; + buffer->input_buffer_length = length; + gui_input_optimize_size (buffer); + + /* copy new string to input */ + strcpy (buffer->input_buffer, input_utf8); + + /* move cursor to the end of new input if it is now after the end */ + if (buffer->input_buffer_pos > buffer->input_buffer_length) + buffer->input_buffer_pos = buffer->input_buffer_length; + + free (input_utf8); + } } /* @@ -196,15 +205,21 @@ gui_input_insert_string (struct t_gui_buffer *buffer, const char *string, int pos) { int size, length; - char *ptr_start; + char *string_utf8, *ptr_start; if (buffer->input) { + string_utf8 = strdup (string); + if (!string_utf8) + return 0; + if (pos == -1) pos = buffer->input_buffer_pos; - size = strlen (string); - length = utf8_strlen (string); + utf8_normalize (string_utf8, '?'); + + size = strlen (string_utf8); + length = utf8_strlen (string_utf8); /* increase buffer size */ buffer->input_buffer_size += size; @@ -218,10 +233,12 @@ gui_input_insert_string (struct t_gui_buffer *buffer, const char *string, /* insert new string */ ptr_start = utf8_add_offset (buffer->input_buffer, pos); - strncpy (ptr_start, string, size); + strncpy (ptr_start, string_utf8, size); buffer->input_buffer_pos += length; + free (string_utf8); + return length; } return 0;