From dc7775a1c6f7825e0b7d6b5de5d7781fc488a557 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 10 May 2013 08:04:14 +0900 Subject: [PATCH] multisense segv (free data that isnt malloced) fix... --- src/lib/edje/edje_multisense.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/lib/edje/edje_multisense.c b/src/lib/edje/edje_multisense.c index 2aef6293ac..8f9082d9a3 100644 --- a/src/lib/edje/edje_multisense.c +++ b/src/lib/edje/edje_multisense.c @@ -16,6 +16,7 @@ static Eina_Bool _play_finished(void *data EINA_UNUSED, Eo *in, const Eo_Event_D struct _edje_multisense_eet_data { sf_count_t offset, length; + Eet_File *ef; const char *data; Ecore_Audio_Vio vio; }; @@ -73,7 +74,9 @@ static void _free(void *data) { struct _edje_multisense_eet_data *eet_data = data; - free(eet_data->data); + if (eet_data->ef) eet_close(eet_data->ef); +// don't free if eet_data->data comes from eet_read_direct +// free(eet_data->data); free(data); } #endif @@ -111,7 +114,17 @@ _edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, c eet_data = calloc(1, sizeof(struct _edje_multisense_eet_data)); - eet_data->data = eet_read_direct(ed->file->ef, snd_id_str, (int *)&eet_data->length); + if (!eet_data) + { + ERR("Out of memory in allocating multisense sample info"); + return EINA_FALSE; + } + // open eet file again to esnure we have reference because we + // use eet_read_direct to avoid duplicating/copying into memory + // by relying on a direct mmap, but this means we need to close + // the eet file handle instead of freeing data + eet_data->ef = eet_open(ed->path, EET_FILE_MODE_READ); + eet_data->data = eet_read_direct(eet_data->ef, snd_id_str, (int *)&eet_data->length); /* action->speed */