From 25944df5cfd9e9f146e7b778923bde0f0612e4f4 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 28 Feb 2013 22:20:25 -0800 Subject: [PATCH] Fixed bug 1736 - Memory leak in X11_InitModes tomaszewski.p XRRListOutputProperties allocates Atom* array, which is not freed. XRRGetOutputProperty allocates 'unsigned char *prop' array, which is not freed. --- src/video/x11/SDL_x11modes.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index e7822f057..d49555ad9 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -576,26 +576,31 @@ X11_InitModes(_THIS) int actual_format; unsigned long nitems, bytes_after; Atom actual_type; - + if (props[i] == EDID) { - XRRGetOutputProperty(data->display, res->outputs[output], props[i], - 0, 100, False, False, - AnyPropertyType, - &actual_type, &actual_format, - &nitems, &bytes_after, &prop); - - MonitorInfo *info = decode_edid(prop); - if (info) { -#ifdef X11MODES_DEBUG - printf("Found EDID data for %s\n", output_info->name); - dump_monitor_info(info); -#endif - SDL_strlcpy(display_name, info->dsc_product_name, sizeof(display_name)); - free(info); + if (XRRGetOutputProperty(data->display, + res->outputs[output], props[i], + 0, 100, False, False, + AnyPropertyType, + &actual_type, &actual_format, + &nitems, &bytes_after, &prop) == Success ) { + MonitorInfo *info = decode_edid(prop); + if (info) { + #ifdef X11MODES_DEBUG + printf("Found EDID data for %s\n", output_info->name); + dump_monitor_info(info); + #endif + SDL_strlcpy(display_name, info->dsc_product_name, sizeof(display_name)); + free(info); + } + SDL_free(prop); } break; } } + if (props) { + SDL_free(props); + } if (*display_name && inches) { size_t len = SDL_strlen(display_name);