On Fri, 10 May 2013 10:25:37 +0900 Cedric BAIL <[email protected]> said:
> On Fri, May 10, 2013 at 9:15 AM, Carsten Haitzler - Enlightenment Git > <[email protected]> wrote: > > raster pushed a commit to branch master. > > > > commit dc7775a1c6f7825e0b7d6b5de5d7781fc488a557 > > Author: Carsten Haitzler (Rasterman) <[email protected]> > > Date: Fri May 10 08:04:14 2013 +0900 > > > > 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 2aef629..8f9082d 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 */ > > Why not using ed->file->ef here ? What is the point of opening that > file again and risking getting a set of data that don't match what the > rest of edje get ? because of eet_read_direct the ptr may still have the memory being accessed by the audio playback after we close the file... so this ensures it is refcounted up to stay around until the close in the sample playback end free cb. -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) [email protected] ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. This 200-page book is written by three acclaimed leaders in the field. The early access version is available now. Download your free book today! http://p.sf.net/sfu/neotech_d2d_may _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
