SOMEONE.... changed the evas jpeg loader to use a membuf src... like
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 30 Jul 2011 01:13:29 +0000 (01:13 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 30 Jul 2011 01:13:29 +0000 (01:13 +0000)
eina_file.... and that SOMEONE didnt check to see if libjpeg always
calls the term func... lkike when decoding headers... when it DOESNT.
force the term func to be called whenever destroying the compress
anyway (and if its already done it'll savely just return and not free
anything)

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@61914 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/modules/loaders/jpeg/evas_image_load_jpeg.c

index 72d44cb..404dcae 100644 (file)
@@ -131,8 +131,8 @@ _evas_jpeg_membuf_src_skip(j_decompress_ptr cinfo,
 static void
 _evas_jpeg_membuf_src_term(j_decompress_ptr cinfo)
 {
-   struct jpeg_membuf_src *src = ((struct jpeg_membuf_src *)cinfo->src)->self;
-
+   struct jpeg_membuf_src *src = (struct jpeg_membuf_src *)cinfo->src;
+   if (!src) return;
    free(src);
    cinfo->src = NULL;
 }
@@ -179,6 +179,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
    if (setjmp(jerr.setjmp_buffer))
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        if (cinfo.saw_JFIF_marker)
          *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
        else
@@ -190,8 +191,9 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
    if (_evas_jpeg_membuf_src(&cinfo, map, length))
      {
         jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
-        return 0;
+        return EINA_FALSE;
      }
 
    jpeg_read_header(&cinfo, TRUE);
@@ -208,6 +210,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
        (IMG_TOO_BIG(w, h)))
      {
         jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        if (IMG_TOO_BIG(w, h))
          *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
        else
@@ -271,13 +274,15 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
    if (ie->scale > 1)
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        jpeg_create_decompress(&cinfo);
 
         if (_evas_jpeg_membuf_src(&cinfo, map, length))
           {
              jpeg_destroy_decompress(&cinfo);
+             _evas_jpeg_membuf_src_term(&cinfo);
              *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
-             return 0;
+             return EINA_FALSE;
           }
 
        jpeg_read_header(&cinfo, TRUE);
@@ -301,6 +306,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
         if ((ie->load_opts.region.w <= 0) || (ie->load_opts.region.h <= 0))
           {
              jpeg_destroy_decompress(&cinfo);
+             _evas_jpeg_membuf_src_term(&cinfo);
             *error = EVAS_LOAD_ERROR_GENERIC;
             return EINA_FALSE;
           }
@@ -310,6 +316,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie,
 /* end head decoding */
 
    jpeg_destroy_decompress(&cinfo);
+   _evas_jpeg_membuf_src_term(&cinfo);
    *error = EVAS_LOAD_ERROR_NONE;
    return EINA_TRUE;
 }
@@ -345,6 +352,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
    if (setjmp(jerr.setjmp_buffer))
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        *error = EVAS_LOAD_ERROR_CORRUPT_FILE;
        return EINA_FALSE;
      }
@@ -353,6 +361,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
    if (_evas_jpeg_membuf_src(&cinfo, map, size))
      {
         jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
         return 0;
      }
@@ -409,6 +418,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
        // race condition, the file could have change from when we call header
        // this test will not solve the problem with region code.
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        *error = EVAS_LOAD_ERROR_GENERIC;
        return EINA_FALSE;
      }
@@ -424,6 +434,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
          ((cinfo.out_color_space == JCS_CMYK) && (cinfo.output_components == 4))))
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
        return EINA_FALSE;
      }
@@ -433,6 +444,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
    if (cinfo.rec_outbuf_height > 16)
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
        return EINA_FALSE;
      }
@@ -441,6 +453,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
    if (ie->flags.loaded)
      {
        jpeg_destroy_decompress(&cinfo);
+        _evas_jpeg_membuf_src_term(&cinfo);
        *error = EVAS_LOAD_ERROR_NONE;
        return EINA_TRUE;
      }
@@ -516,6 +529,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
                   if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
                     {
                        jpeg_destroy_decompress(&cinfo);
+                       _evas_jpeg_membuf_src_term(&cinfo);
                       *error = EVAS_LOAD_ERROR_NONE;
                        return EINA_FALSE;
                     }
@@ -624,6 +638,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
                   if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
                     {
                        jpeg_destroy_decompress(&cinfo);
+                       _evas_jpeg_membuf_src_term(&cinfo);
 /*                       
                        t = get_time() - t;
                        printf("%3.3f\n", t);
@@ -689,6 +704,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
                   if (l >= (ie->load_opts.region.y + ie->load_opts.region.h))
                     {
                        jpeg_destroy_decompress(&cinfo);
+                       _evas_jpeg_membuf_src_term(&cinfo);
                       *error = EVAS_LOAD_ERROR_NONE;
                        return EINA_TRUE;
                     }
@@ -720,6 +736,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie,
 /* end data decoding */
    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
+   _evas_jpeg_membuf_src_term(&cinfo);
    *error = EVAS_LOAD_ERROR_NONE;
    return EINA_TRUE;
 }