From 805cefae9022ee2bbf020bae754cc424bd5b48dc Mon Sep 17 00:00:00 2001 From: Nicolas Cellier Date: Tue, 21 Feb 2017 01:20:58 +0100 Subject: [PATCH 1/2] Fix issue 119 jpeg plugin crashes in Win64 Solution is to align jump_buf on 16bytes boundary by using malloc/free pairs around setjmp/longjmp calls. The struct error_mgr2 now contains a pointer to the jump_buf for this purpose. --- .../Cross/plugins/JPEGReadWriter2Plugin/Error.c | 4 ++-- .../JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.h | 2 +- .../JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/platforms/Cross/plugins/JPEGReadWriter2Plugin/Error.c b/platforms/Cross/plugins/JPEGReadWriter2Plugin/Error.c index b6832d28dd..aa9f3dffcd 100755 --- a/platforms/Cross/plugins/JPEGReadWriter2Plugin/Error.c +++ b/platforms/Cross/plugins/JPEGReadWriter2Plugin/Error.c @@ -5,7 +5,7 @@ struct error_mgr2 { struct jpeg_error_mgr pub; /* "public" fields */ - jmp_buf setjmp_buffer; /* for return to caller */ + jmp_buf *setjmp_buffer; /* for return to caller */ }; typedef struct error_mgr2 * error_ptr2; @@ -20,5 +20,5 @@ void error_exit (j_common_ptr cinfo) error_ptr2 myerr = (error_ptr2) cinfo->err; /* Return control to the setjmp point */ - longjmp(myerr->setjmp_buffer, 1); + longjmp(*myerr->setjmp_buffer, 1); } diff --git a/platforms/Cross/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.h b/platforms/Cross/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.h index 2e2ee52344..92445bf73b 100755 --- a/platforms/Cross/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.h +++ b/platforms/Cross/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.h @@ -6,7 +6,7 @@ struct error_mgr2 { struct jpeg_error_mgr pub; /* "public" fields */ - jmp_buf setjmp_buffer; /* for return to caller */ + jmp_buf *setjmp_buffer; /* for return to caller */ }; typedef struct error_mgr2* error_ptr2; diff --git a/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c b/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c index 7730090577..1b718230d4 100644 --- a/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c +++ b/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c @@ -54,9 +54,10 @@ primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgrWriteScanlines( error_ptr2 pjerr = (error_ptr2)jpegErrorMgr2Struct; pcinfo->err = jpeg_std_error(&pjerr->pub); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; - if (setjmp(pjerr->setjmp_buffer)) { + if (setjmp(*pjerr->setjmp_buffer)) { jpeg_destroy_compress(pcinfo); *destinationSizePtr = 0; @@ -133,6 +134,7 @@ primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgrWriteScanlines( jpeg_finish_compress(pcinfo); jpeg_destroy_compress(pcinfo); } + free(pjerr->setjmp_buffer); } void @@ -152,9 +154,10 @@ primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgrReadScanlines( int ok = 1; pcinfo->err = jpeg_std_error(&pjerr->pub); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; - if (setjmp(pjerr->setjmp_buffer)) { + if (setjmp(*pjerr->setjmp_buffer)) { jpeg_destroy_decompress(pcinfo); ok = 0; } @@ -280,6 +283,7 @@ primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgrReadScanlines( jpeg_finish_decompress(pcinfo); jpeg_destroy_decompress(pcinfo); } + free(pjerr->setjmp_buffer); } void @@ -293,9 +297,10 @@ primJPEGReadHeaderfromByteArraysizeerrorMgrReadHeader( error_ptr2 pjerr = (error_ptr2)jpegErrorMgr2Struct; pcinfo->err = jpeg_std_error(&pjerr->pub); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; - if (setjmp(pjerr->setjmp_buffer)) { + if (setjmp(*pjerr->setjmp_buffer)) { jpeg_destroy_decompress(pcinfo); sourceSize = 0; } @@ -305,4 +310,5 @@ primJPEGReadHeaderfromByteArraysizeerrorMgrReadHeader( jpeg_mem_src(pcinfo, source, sourceSize); jpeg_read_header(pcinfo, TRUE); } + free(pjerr->setjmp_buffer); } From e13cbb45ce74cb298b6e971999a5694a36703290 Mon Sep 17 00:00:00 2001 From: Nicolas Cellier Date: Tue, 21 Feb 2017 01:27:23 +0100 Subject: [PATCH 2/2] Thanks Xcode for mixing spaces and tabs alignment --- .../JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c b/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c index 1b718230d4..5da90ab792 100644 --- a/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c +++ b/platforms/Cross/plugins/JPEGReadWriter2Plugin/sqJPEGReadWriter2Plugin.c @@ -54,7 +54,7 @@ primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgrWriteScanlines( error_ptr2 pjerr = (error_ptr2)jpegErrorMgr2Struct; pcinfo->err = jpeg_std_error(&pjerr->pub); - pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; if (setjmp(*pjerr->setjmp_buffer)) { @@ -134,7 +134,7 @@ primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgrWriteScanlines( jpeg_finish_compress(pcinfo); jpeg_destroy_compress(pcinfo); } - free(pjerr->setjmp_buffer); + free(pjerr->setjmp_buffer); } void @@ -154,7 +154,7 @@ primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgrReadScanlines( int ok = 1; pcinfo->err = jpeg_std_error(&pjerr->pub); - pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; if (setjmp(*pjerr->setjmp_buffer)) { @@ -283,7 +283,7 @@ primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgrReadScanlines( jpeg_finish_decompress(pcinfo); jpeg_destroy_decompress(pcinfo); } - free(pjerr->setjmp_buffer); + free(pjerr->setjmp_buffer); } void @@ -297,7 +297,7 @@ primJPEGReadHeaderfromByteArraysizeerrorMgrReadHeader( error_ptr2 pjerr = (error_ptr2)jpegErrorMgr2Struct; pcinfo->err = jpeg_std_error(&pjerr->pub); - pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); + pjerr->setjmp_buffer = (jmp_buf *) malloc(sizeof(jmp_buf)); pjerr->pub.error_exit = error_exit; if (setjmp(*pjerr->setjmp_buffer)) { @@ -310,5 +310,5 @@ primJPEGReadHeaderfromByteArraysizeerrorMgrReadHeader( jpeg_mem_src(pcinfo, source, sourceSize); jpeg_read_header(pcinfo, TRUE); } - free(pjerr->setjmp_buffer); + free(pjerr->setjmp_buffer); }