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 ?
--
Cedric BAIL

------------------------------------------------------------------------------
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

Reply via email to