summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_JPEG_Image.cxx22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/Fl_JPEG_Image.cxx b/src/Fl_JPEG_Image.cxx
index ee3899853..2be83211c 100644
--- a/src/Fl_JPEG_Image.cxx
+++ b/src/Fl_JPEG_Image.cxx
@@ -101,9 +101,11 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load
jpeg_decompress_struct dinfo; // Decompressor info
fl_jpeg_error_mgr jerr; // Error handler info
JSAMPROW row; // Sample row pointer
- int max_finish_decompress_err = 10; // give up after too many errors
- int max_destroy_decompress_err = 10; // give up after too many errors
+ // the following variables are pointers allocating some private space that
+ // is not reset by 'setjmp()'
+ char* max_finish_decompress_err; // count errors and give up afer a while
+ char* max_destroy_decompress_err; // to avoid recusion and deadlock
// Clear data...
alloc_array = 0;
@@ -117,14 +119,20 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load
jerr.pub_.error_exit = fl_jpeg_error_handler;
jerr.pub_.output_message = fl_jpeg_output_handler;
+ // Setup error loop variables
+ max_finish_decompress_err = (char*)malloc(1); // allocate space on the frame for error counters
+ max_destroy_decompress_err = (char*)malloc(1); // otherwise, the variables are reset on the longjmp
+ *max_finish_decompress_err=10;
+ *max_destroy_decompress_err=10;
+
if (setjmp(jerr.errhand_))
{
// JPEG error handling...
// if any of the cleanup routines hits another error, we would end up
// in a loop. So instead, we decrement max_err for some upper cleanup limit.
- if ( (max_finish_decompress_err-- > 0) && array)
+ if ( ((*max_finish_decompress_err)-- > 0) && array)
jpeg_finish_decompress(&dinfo);
- if ( max_destroy_decompress_err-- > 0)
+ if ( (*max_destroy_decompress_err)-- > 0)
jpeg_destroy_decompress(&dinfo);
fclose(fp);
@@ -139,6 +147,9 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load
alloc_array = 0;
}
+ free(max_destroy_decompress_err);
+ free(max_finish_decompress_err);
+
return;
}
@@ -172,6 +183,9 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load
jpeg_finish_decompress(&dinfo);
jpeg_destroy_decompress(&dinfo);
+ free(max_destroy_decompress_err);
+ free(max_finish_decompress_err);
+
fclose(fp);
#endif // HAVE_LIBJPEG
}