server: Store length of console title instead of null-terminating it.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Alexandre Julliard 2020-03-21 11:44:03 +01:00
parent a88973a5f9
commit 8d6d5a9bc6
1 changed files with 12 additions and 16 deletions

View File

@ -53,6 +53,7 @@ struct console_input
INPUT_RECORD *records; /* input records */ INPUT_RECORD *records; /* input records */
struct console_input_events *evt; /* synchronization event with renderer */ struct console_input_events *evt; /* synchronization event with renderer */
WCHAR *title; /* console title */ WCHAR *title; /* console title */
data_size_t title_len; /* length of console title */
WCHAR **history; /* lines history */ WCHAR **history; /* lines history */
int history_size; /* number of entries in history array */ int history_size; /* number of entries in history array */
int history_index; /* number of used entries in history array */ int history_index; /* number of used entries in history array */
@ -339,6 +340,7 @@ static struct object *create_console_input( struct thread* renderer, int fd )
console_input->records = NULL; console_input->records = NULL;
console_input->evt = renderer ? create_console_input_events() : NULL; console_input->evt = renderer ? create_console_input_events() : NULL;
console_input->title = NULL; console_input->title = NULL;
console_input->title_len = 0;
console_input->history_size = 50; console_input->history_size = 50;
console_input->history = calloc( console_input->history_size, sizeof(WCHAR*) ); console_input->history = calloc( console_input->history_size, sizeof(WCHAR*) );
console_input->history_index = 0; console_input->history_index = 0;
@ -779,16 +781,15 @@ static int set_console_input_info( const struct set_console_input_info_request *
} }
if (req->mask & SET_CONSOLE_INPUT_INFO_TITLE) if (req->mask & SET_CONSOLE_INPUT_INFO_TITLE)
{ {
WCHAR *new_title = mem_alloc( len + sizeof(WCHAR) ); WCHAR *new_title = NULL;
if (new_title)
{ len = (len / sizeof(WCHAR)) * sizeof(WCHAR);
memcpy( new_title, title, len ); if (len && !(new_title = memdup( title, len ))) goto error;
new_title[len / sizeof(WCHAR)] = 0; free( console->title );
free( console->title ); console->title = new_title;
console->title = new_title; console->title_len = len;
evt.event = CONSOLE_RENDERER_TITLE_EVENT; evt.event = CONSOLE_RENDERER_TITLE_EVENT;
console_input_events_append( console, &evt ); console_input_events_append( console, &evt );
}
} }
if (req->mask & SET_CONSOLE_INPUT_INFO_HISTORY_MODE) if (req->mask & SET_CONSOLE_INPUT_INFO_HISTORY_MODE)
{ {
@ -1629,12 +1630,7 @@ DECL_HANDLER(get_console_input_info)
struct console_input *console; struct console_input *console;
if (!(console = console_input_get( req->handle, FILE_READ_PROPERTIES ))) return; if (!(console = console_input_get( req->handle, FILE_READ_PROPERTIES ))) return;
if (console->title) if (console->title) set_reply_data( console->title, min( console->title_len, get_reply_max_size() ));
{
data_size_t len = strlenW( console->title ) * sizeof(WCHAR);
if (len > get_reply_max_size()) len = get_reply_max_size();
set_reply_data( console->title, len );
}
reply->history_mode = console->history_mode; reply->history_mode = console->history_mode;
reply->history_size = console->history_size; reply->history_size = console->history_size;
reply->history_index = console->history_index; reply->history_index = console->history_index;