summaryrefslogtreecommitdiff
path: root/src/Fl_JPEG_Image.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2005-08-29 19:36:59 +0000
committerMatthias Melcher <fltk@matthiasm.com>2005-08-29 19:36:59 +0000
commitf5c58cc8d3177af94f45a397c58a630981ab12a4 (patch)
tree65875bb5f8cece64385be840f764ab6a99b46838 /src/Fl_JPEG_Image.cxx
parentdc1b3aaf1a0da30f2ea20d6fa47da2da0d0cebad (diff)
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4543 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_JPEG_Image.cxx')
-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
}