summaryrefslogtreecommitdiff
path: root/src/jpeg.c
diff options
context:
space:
mode:
authorJorge Arellano Cid <jcid@dillo.org>2009-05-08 16:39:19 -0400
committerJorge Arellano Cid <jcid@dillo.org>2009-05-08 16:39:19 -0400
commitc206e5e68a1e009df93cf9175d521a4c587158d1 (patch)
tree104c2e6611501b43e93acf1b65a7c3c8f18b6bd3 /src/jpeg.c
parent7034881b87b53b087bae78aef8380e5258f68a24 (diff)
Fix a memory leak when stopping an image-decoding process
Diffstat (limited to 'src/jpeg.c')
-rw-r--r--src/jpeg.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/jpeg.c b/src/jpeg.c
index 9d611ba8..c8a1accf 100644
--- a/src/jpeg.c
+++ b/src/jpeg.c
@@ -94,14 +94,23 @@ METHODDEF(void) Jpeg_errorexit (j_common_ptr cinfo)
}
/*
+ * Free the jpeg-decoding data structure.
+ */
+static void Jpeg_free(DilloJpeg *jpeg)
+{
+ MSG("Jpeg_free %p\n", jpeg);
+ jpeg_destroy_decompress(&(jpeg->cinfo));
+ dFree(jpeg);
+}
+
+/*
* Finish the decoding process
*/
static void Jpeg_close(DilloJpeg *jpeg, CacheClient_t *Client)
{
_MSG("Jpeg_close\n");
a_Dicache_close(jpeg->url, jpeg->version, Client);
- jpeg_destroy_decompress(&(jpeg->cinfo));
- dFree(jpeg);
+ Jpeg_free(jpeg);
}
/*
@@ -174,6 +183,7 @@ void *a_Jpeg_new(DilloImage *Image, DilloUrl *url, int version)
{
my_source_mgr *src;
DilloJpeg *jpeg = dMalloc(sizeof(*jpeg));
+ MSG("Jpeg_new: jpeg=%p\n", jpeg);
jpeg->Image = Image;
jpeg->url = url;
@@ -206,12 +216,17 @@ void *a_Jpeg_new(DilloImage *Image, DilloUrl *url, int version)
return jpeg;
}
-void a_Jpeg_callback(int Op, CacheClient_t *Client)
+void a_Jpeg_callback(int Op, void *data)
{
- if (Op)
- Jpeg_close(Client->CbData, Client);
- else
+ if (Op == CA_Send) {
+ CacheClient_t *Client = data;
Jpeg_write(Client->CbData, Client->Buf, Client->BufSize);
+ } else if (Op == CA_Close) {
+ CacheClient_t *Client = data;
+ Jpeg_close(Client->CbData, Client);
+ } else if (Op == CA_Abort) {
+ Jpeg_free(data);
+ }
}
/*