From e417036f60ec187a6696f2e447a1f269a338d6e7 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Mon, 2 Jun 2014 21:26:22 +1000 Subject: skin_engine: Don't double free buflib handles shared by skin images Change-Id: I4158fb7dae664a746141f458c08bdcb84e148041 --- apps/gui/skin_engine/skin_parser.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'apps/gui/skin_engine/skin_parser.c') diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index bd89372d22..6e32400f27 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -1666,7 +1666,19 @@ void skin_data_free_buflib_allocs(struct wps_data *wps_data) struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token); struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); if (img->buflib_handle > 0) + { + struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next);; core_free(img->buflib_handle); + + while (imglist) + { + struct wps_token *freetoken = SKINOFFSETTOPTR(skin_buffer, imglist->token); + struct gui_img *freeimg = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, freetoken->value.data); + if (img->buflib_handle == freeimg->buflib_handle) + freeimg->buflib_handle = -1; + imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); + } + } list = SKINOFFSETTOPTR(skin_buffer, list->next); } wps_data->images = PTRTOSKINOFFSET(skin_buffer, NULL); -- cgit v1.2.3