From 3bcac616f706b9126a3306cf7777e7b4532cf07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sat, 6 Sep 2014 22:37:33 -0300 Subject: [PATCH 1/4] (Lakka) Fix invalid read --- frontend/menu/disp/lakka.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index 6e4e02fdf4..cfb5694cdd 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -1103,7 +1103,7 @@ static void *lakka_init(void) category->active_item = 0; category->num_items = 0; category->items = (menu_item_t*) - calloc(category->num_items, sizeof(menu_item_t)); + calloc(category->num_items + 1, sizeof(menu_item_t)); lakka_init_items(i, category, info, g_settings.content_directory); } From 5ba310918d97e0d3f40a0fc978209cf7a50cef90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sat, 6 Sep 2014 22:50:04 -0300 Subject: [PATCH 2/4] (Lakka) Avoid invalid read and properly deinitialize sub menu items --- frontend/menu/disp/lakka.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index cfb5694cdd..dc335aea37 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -649,7 +649,7 @@ static GLuint png_texture_load(const char * file_name) static void lakka_context_destroy(void *data) { - int i, j; + int i, j, k; gl_t *gl = (gl_t*)driver.video_data; for (i = 0; i < TEXTURE_LAST; i++) @@ -672,9 +672,12 @@ static void lakka_context_destroy(void *data) item = (menu_item_t*)&category->items[j]; - if (item) + if (!item) + continue; + + for (k = 0; k < item->num_subitems; k++ ) { - subitem = (menu_subitem_t*)&item->subitems[j]; + subitem = (menu_subitem_t*)&item->subitems[k]; if (subitem) glDeleteTextures(1, &subitem->icon); From a583a1b941c34c329f2ce54ace59e93a73bee0ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sat, 6 Sep 2014 22:56:30 -0300 Subject: [PATCH 3/4] (Lakka) Fix directory list memleak --- frontend/menu/disp/lakka.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index dc335aea37..6019c74410 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -1019,6 +1019,8 @@ static void lakka_init_items(int i, menu_category_t *category, } } } + + string_list_free(list); } static void lakka_free(void *data) From f9206a54193cfa6d7fb0df28577e374f61366b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sat, 6 Sep 2014 22:59:27 -0300 Subject: [PATCH 4/4] (Lakka) Coding standard compliance fixes --- frontend/menu/disp/lakka.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index 6019c74410..e39469f200 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -540,7 +540,7 @@ static void lakka_draw_items(int i) continue; if (i >= menu_active_category - 1 && - i <= menu_active_category + 1) /* performance improvement */ + i <= menu_active_category + 1) /* performance improvement */ { lakka_draw_icon(category->item_icon, margin_left + hspacing*(i+1) + @@ -895,11 +895,14 @@ static void lakka_context_reset(void *data) if (info_list) info = (core_info_t*)&info_list->list[i-1]; - if (info != NULL && info->systemname) { + if (info != NULL && info->systemname) + { char *tmp = str_replace(info->systemname, "/", " "); strlcpy(core_id, tmp, sizeof(core_id)); free(tmp); - } else { + } + else + { strlcpy(core_id, "default", sizeof(core_id)); } @@ -1059,13 +1062,17 @@ static void lakka_init_core_info(void *data) core_info_list_free(g_extern.core_info); g_extern.core_info = NULL; - if (*g_settings.libretro_directory) { + if (*g_settings.libretro_directory) + { g_extern.core_info = core_info_list_new(g_settings.libretro_directory); } - if (g_extern.core_info) { + if (g_extern.core_info) + { num_categories = g_extern.core_info->count + 1; - } else { + } + else + { num_categories = 1; } } @@ -1075,6 +1082,7 @@ static void *lakka_init(void) int i; menu_handle_t *menu = (menu_handle_t*)calloc(1, sizeof(*menu)); gl_t *gl = (gl_t*)driver.video_data; + if (!menu || !gl) return NULL;