aboutsummaryrefslogtreecommitdiffstats
path: root/rd/read-jpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'rd/read-jpeg.c')
-rw-r--r--rd/read-jpeg.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/rd/read-jpeg.c b/rd/read-jpeg.c
index d12fb40..b6b13f6 100644
--- a/rd/read-jpeg.c
+++ b/rd/read-jpeg.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <errno.h>
#include <jpeglib.h>
+#include <setjmp.h>
#include <libexif/exif-data.h>
@@ -18,6 +19,7 @@ struct jpeg_state {
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
+ jmp_buf errjump;
JSAMPARRAY buffer; /* Output row buffer */
int row_stride,linelength; /* physical row width in output buffer */
unsigned char *image,*ptr;
@@ -65,6 +67,16 @@ static struct jpeg_source_mgr thumbnail_mgr = {
/* ---------------------------------------------------------------------- */
/* jpeg loader */
+static void jerror_exit(j_common_ptr info)
+{
+ struct jpeg_decompress_struct *cinfo = (struct jpeg_decompress_struct *)info;
+ struct jpeg_state *h = container_of(cinfo, struct jpeg_state, cinfo);
+ cinfo->err->output_message(info);
+ longjmp(h->errjump, 1);
+ jpeg_destroy_decompress(cinfo);
+ exit(1);
+}
+
static void*
jpeg_init(FILE *fp, char *filename, unsigned int page,
struct ida_image_info *i, int thumbnail)
@@ -77,6 +89,10 @@ jpeg_init(FILE *fp, char *filename, unsigned int page,
h->infile = fp;
h->cinfo.err = jpeg_std_error(&h->jerr);
+ h->cinfo.err->error_exit = jerror_exit;
+ if(setjmp(h->errjump))
+ return 0;
+
jpeg_create_decompress(&h->cinfo);
jpeg_save_markers(&h->cinfo, JPEG_COM, 0xffff); /* comment */
jpeg_save_markers(&h->cinfo, JPEG_APP0+1, 0xffff); /* EXIF */
@@ -156,6 +172,9 @@ jpeg_read(unsigned char *dst, unsigned int line, void *data)
{
struct jpeg_state *h = data;
JSAMPROW row = dst;
+
+ if(setjmp(h->errjump))
+ return;
jpeg_read_scanlines(&h->cinfo, &row, 1);
}
@@ -163,6 +182,9 @@ static void
jpeg_done(void *data)
{
struct jpeg_state *h = data;
+
+ if (setjmp(h->errjump))
+ return;
jpeg_destroy_decompress(&h->cinfo);
if (h->infile)
fclose(h->infile);