diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2005-08-29 19:36:59 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2005-08-29 19:36:59 +0000 |
| commit | f5c58cc8d3177af94f45a397c58a630981ab12a4 (patch) | |
| tree | 65875bb5f8cece64385be840f764ab6a99b46838 | |
| parent | dc1b3aaf1a0da30f2ea20d6fa47da2da0d0cebad (diff) | |
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4543 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | src/Fl_JPEG_Image.cxx | 22 |
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 } |
