# HG changeset patch # User reimar # Date 1352553925 0 # Node ID 990a80ea52d356dc17859d2c763d8514ce508442 # Parent 8f6d3f8ffa61165bf162747cf53933018f48cb75 Fix leaks in case of error. diff -r 8f6d3f8ffa61 -r 990a80ea52d3 libmenu/menu.c --- a/libmenu/menu.c Sat Nov 10 13:19:29 2012 +0000 +++ b/libmenu/menu.c Sat Nov 10 13:25:25 2012 +0000 @@ -232,15 +232,15 @@ int menu_init(struct MPContext *mpctx, char* cfg_file) { char* buffer = NULL; int bl = BUF_STEP, br = 0; - int f, fd; + int f = 0, fd = -1; #ifndef CONFIG_FREETYPE if(vo_font == NULL) - return 0; + goto out; #endif fd = open(cfg_file, O_RDONLY); if(fd < 0) { mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_CantOpenConfigFile,cfg_file); - return 0; + goto out; } buffer = malloc(bl); while(1) { @@ -248,9 +248,7 @@ if(bl - br < BUF_MIN) { if(bl >= BUF_MAX) { mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_ConfigFileIsTooBig,BUF_MAX/1024); - close(fd); - free(buffer); - return 0; + goto out; } bl += BUF_STEP; buffer = realloc(buffer,bl); @@ -261,14 +259,15 @@ } if(!br) { mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_LIBMENU_ConfigFileIsEmpty); - return 0; + goto out; } buffer[br-1] = '\0'; - close(fd); - menu_ctx = mpctx; f = menu_parse_config(buffer); + +out: + if (fd != -1) close(fd); free(buffer); return f; }