Ticket #1769: gdal_svn_trunk_1769.patch

File gdal_svn_trunk_1769.patch, 2.1 kB (added by rouault, 8 months ago)
  • frmts/png/pngdataset.cpp

    old new  
    451451 
    452452    hPNG = png_create_read_struct( PNG_LIBPNG_VER_STRING, this, NULL, NULL ); 
    453453 
    454     png_set_error_fn( hPNG, this, png_gdal_error, png_gdal_warning ); 
     454    png_set_error_fn( hPNG, &sSetJmpContext, png_gdal_error, png_gdal_warning ); 
    455455    if( setjmp( sSetJmpContext ) != 0 ) 
    456456        return; 
    457457 
     
    704704/* -------------------------------------------------------------------- */ 
    705705/*      Setup error handling.                                           */ 
    706706/* -------------------------------------------------------------------- */ 
    707     png_set_error_fn( poDS->hPNG, poDS, png_gdal_error, png_gdal_warning ); 
     707    png_set_error_fn( poDS->hPNG, &poDS->sSetJmpContext, png_gdal_error, png_gdal_warning ); 
    708708 
    709709    if( setjmp( poDS->sSetJmpContext ) != 0 ) 
    710710        return NULL; 
     
    972972    png_structp hPNG; 
    973973    png_infop   psPNGInfo; 
    974974     
     975    jmp_buf     sSetJmpContext; 
    975976    hPNG = png_create_write_struct( PNG_LIBPNG_VER_STRING,  
    976                                     NULL, NULL, NULL ); 
     977                                    &sSetJmpContext, png_gdal_error, png_gdal_warning ); 
    977978    psPNGInfo = png_create_info_struct( hPNG ); 
    978      
     979 
     980    if( setjmp( sSetJmpContext ) != 0 ) 
     981    { 
     982        VSIFCloseL( fpImage ); 
     983        png_destroy_write_struct( &hPNG, &psPNGInfo ); 
     984        return NULL; 
     985    } 
     986 
    979987    png_set_write_fn( hPNG, fpImage, png_vsi_write_data, png_vsi_flush ); 
    980988 
    981989    png_set_IHDR( hPNG, psPNGInfo, nXSize, nYSize,  
     
    12401248    // libpng is generally not built as C++ and so won't honour unwind 
    12411249    // semantics.  Ugg.  
    12421250 
    1243     PNGDataset *poDS = (PNGDataset *) png_ptr->error_ptr; 
    1244  
    1245     longjmp( poDS->sSetJmpContext, 1 ); 
     1251    jmp_buf* psSetJmpContext = (jmp_buf*) png_ptr->error_ptr; 
     1252    if (psSetJmpContext) 
     1253    { 
     1254        longjmp( *psSetJmpContext, 1 ); 
     1255    } 
    12461256} 
    12471257 
    12481258/************************************************************************/