Jacek Caban : conhost: Fix a leak in create_screen_buffer.
Alexandre Julliard
julliard at winehq.org
Tue Sep 22 15:46:41 CDT 2020
Module: wine
Branch: master
Commit: c840de2839f67793483bae633362b2daf00e3949
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c840de2839f67793483bae633362b2daf00e3949
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Sep 22 16:46:09 2020 +0200
conhost: Fix a leak in create_screen_buffer.
Based on patch by Haidong Yu.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/conhost/conhost.c | 44 ++++++++++++++++++--------------------------
1 file changed, 18 insertions(+), 26 deletions(-)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index c0a0e08e6d..82cee8bdf0 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -166,41 +166,48 @@ static int screen_buffer_compare_id( const void *key, const struct wine_rb_entry
static struct wine_rb_tree screen_buffer_map = { screen_buffer_compare_id };
+static void destroy_screen_buffer( struct screen_buffer *screen_buffer )
+{
+ if (screen_buffer->console->active == screen_buffer)
+ screen_buffer->console->active = NULL;
+ wine_rb_remove( &screen_buffer_map, &screen_buffer->entry );
+ free( screen_buffer->data );
+ free( screen_buffer );
+}
+
static struct screen_buffer *create_screen_buffer( struct console *console, int id, int width, int height )
{
struct screen_buffer *screen_buffer;
unsigned int i;
- if (!(screen_buffer = malloc( sizeof(*screen_buffer) ))) return NULL;
+ if (!(screen_buffer = calloc( 1, sizeof(*screen_buffer) ))) return NULL;
screen_buffer->console = console;
screen_buffer->id = id;
screen_buffer->mode = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
screen_buffer->cursor_size = 100;
screen_buffer->cursor_visible = 1;
- screen_buffer->cursor_x = 0;
- screen_buffer->cursor_y = 0;
screen_buffer->width = width;
screen_buffer->height = height;
screen_buffer->attr = 0x07;
screen_buffer->popup_attr = 0xf5;
screen_buffer->max_width = 80;
screen_buffer->max_height = 25;
- screen_buffer->win.left = 0;
screen_buffer->win.right = min( screen_buffer->max_width - 1, width - 1 );
- screen_buffer->win.top = 0;
screen_buffer->win.bottom = min( screen_buffer->max_height - 1, height - 1);
- screen_buffer->font.width = 0;
- screen_buffer->font.height = 0;
screen_buffer->font.weight = FW_NORMAL;
screen_buffer->font.pitch_family = FIXED_PITCH | FF_DONTCARE;
- screen_buffer->font.face_name = NULL;
- screen_buffer->font.face_len = 0;
- memset( screen_buffer->color_map, 0, sizeof(screen_buffer->color_map) );
+
+ if (wine_rb_put( &screen_buffer_map, LongToPtr(id), &screen_buffer->entry ))
+ {
+ free( screen_buffer );
+ ERR( "id %x already exists\n", id );
+ return NULL;
+ }
if (!(screen_buffer->data = malloc( screen_buffer->width * screen_buffer->height *
sizeof(*screen_buffer->data) )))
{
- free( screen_buffer );
+ destroy_screen_buffer( screen_buffer );
return NULL;
}
@@ -211,24 +218,9 @@ static struct screen_buffer *create_screen_buffer( struct console *console, int
memcpy( &screen_buffer->data[i * screen_buffer->width], screen_buffer->data,
screen_buffer->width * sizeof(char_info_t) );
- if (wine_rb_put( &screen_buffer_map, LongToPtr(id), &screen_buffer->entry ))
- {
- ERR( "id %x already exists\n", id );
- return NULL;
- }
-
return screen_buffer;
}
-static void destroy_screen_buffer( struct screen_buffer *screen_buffer )
-{
- if (screen_buffer->console->active == screen_buffer)
- screen_buffer->console->active = NULL;
- wine_rb_remove( &screen_buffer_map, &screen_buffer->entry );
- free( screen_buffer->data );
- free( screen_buffer );
-}
-
static BOOL is_active( struct screen_buffer *screen_buffer )
{
return screen_buffer == screen_buffer->console->active;
More information about the wine-cvs
mailing list