--- ekg-1.6/src/events.c.orig 2005-10-09 12:50:15.000000000 +0200 +++ ekg-1.6/src/events.c 2006-02-20 00:04:49.218225000 +0100 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include "commands.h" @@ -1515,6 +1516,21 @@ return NULL; } +#ifdef HAVE_LIBJPEG + +struct ekg_jpeg_error_mgr { + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +void ekg_jpeg_error_exit(j_common_ptr j) +{ + struct ekg_jpeg_error_mgr *e = (struct ekg_jpeg_error_mgr *) j->err; + /* Return control to the setjmp point */ + longjmp(e->setjmp_buffer, 1); +} +#endif + /* * handle_token() * @@ -1569,7 +1585,7 @@ #ifdef HAVE_LIBJPEG if (config_display_token) { struct jpeg_decompress_struct j; - struct jpeg_error_mgr e; + struct ekg_jpeg_error_mgr e; JSAMPROW buf[1]; int size; char *token, *tmp; @@ -1581,7 +1597,18 @@ goto fail; } - j.err = jpeg_std_error(&e); + j.err = jpeg_std_error(&e.pub); + e.pub.error_exit = ekg_jpeg_error_exit; + /* Establish the setjmp return context for ekg_jpeg_error_exit to use. */ + if (setjmp(e.setjmp_buffer)) { + char buf[JMSG_LENGTH_MAX]; + /* If we ended up over here, then it means some call below called longjmp. */ + (e.pub.format_message)((j_common_ptr)&j, buf); + print("token_failed", buf); + jpeg_destroy_decompress(&j); + fclose(f); + goto fail; + } jpeg_create_decompress(&j); jpeg_stdio_src(&j, f); jpeg_read_header(&j, TRUE); @@ -1623,7 +1650,7 @@ unlink(file); } else -#else /* HAVE_LIBJPEG */ +#endif /* HAVE_LIBJPEG */ { char *file2 = saprintf("%s.jpg", file); @@ -1634,7 +1661,6 @@ xfree(file2); } -#endif /* HAVE_LIBJPEG */ #else /* HAVE_MKSTEMP */ print("token_unsupported");