| OLD | NEW | 
|---|
|  | 1 | 
| 1 /* pngerror.c - stub functions for i/o and memory allocation | 2 /* pngerror.c - stub functions for i/o and memory allocation | 
| 2  * | 3  * | 
| 3  * Last changed in libpng 1.6.1 [March 28, 2013] | 4  * Last changed in libpng 1.6.15 [November 20, 2014] | 
| 4  * Copyright (c) 1998-2013 Glenn Randers-Pehrson | 5  * Copyright (c) 1998-2014 Glenn Randers-Pehrson | 
| 5  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 6  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 
| 6  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 7  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 
| 7  * | 8  * | 
| 8  * This code is released under the libpng license. | 9  * This code is released under the libpng license. | 
| 9  * For conditions of distribution and use, see the disclaimer | 10  * For conditions of distribution and use, see the disclaimer | 
| 10  * and license in png.h | 11  * and license in png.h | 
| 11  * | 12  * | 
| 12  * This file provides a location for all error handling.  Users who | 13  * This file provides a location for all error handling.  Users who | 
| 13  * need special error handling are expected to write replacement functions | 14  * need special error handling are expected to write replacement functions | 
| 14  * and use png_set_error_fn() to use those functions.  See the instructions | 15  * and use png_set_error_fn() to use those functions.  See the instructions | 
| 15  * at each function. | 16  * at each function. | 
| 16  */ | 17  */ | 
| 17 | 18 | 
| 18 #include "pngpriv.h" | 19 #include "pngpriv.h" | 
| 19 | 20 | 
| 20 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) | 21 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) | 
| 21 | 22 | 
| 22 static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr, | 23 static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr, | 
| 23     png_const_charp error_message)),PNG_NORETURN); | 24     png_const_charp error_message)),PNG_NORETURN); | 
| 24 | 25 | 
| 25 #ifdef PNG_WARNINGS_SUPPORTED | 26 #ifdef PNG_WARNINGS_SUPPORTED | 
| 26 static void /* PRIVATE */ | 27 static void /* PRIVATE */ | 
| 27 png_default_warning PNGARG((png_const_structrp png_ptr, | 28 png_default_warning PNGARG((png_const_structrp png_ptr, | 
| 28    png_const_charp warning_message)); | 29    png_const_charp warning_message)); | 
| 29 #endif /* PNG_WARNINGS_SUPPORTED */ | 30 #endif /* WARNINGS */ | 
| 30 | 31 | 
| 31 /* This function is called whenever there is a fatal error.  This function | 32 /* This function is called whenever there is a fatal error.  This function | 
| 32  * should not be changed.  If there is a need to handle errors differently, | 33  * should not be changed.  If there is a need to handle errors differently, | 
| 33  * you should supply a replacement error function and use png_set_error_fn() | 34  * you should supply a replacement error function and use png_set_error_fn() | 
| 34  * to replace the error function at run-time. | 35  * to replace the error function at run-time. | 
| 35  */ | 36  */ | 
| 36 #ifdef PNG_ERROR_TEXT_SUPPORTED | 37 #ifdef PNG_ERROR_TEXT_SUPPORTED | 
| 37 PNG_FUNCTION(void,PNGAPI | 38 PNG_FUNCTION(void,PNGAPI | 
| 38 png_error,(png_const_structrp png_ptr, png_const_charp error_message), | 39 png_error,(png_const_structrp png_ptr, png_const_charp error_message), | 
| 39    PNG_NORETURN) | 40    PNG_NORETURN) | 
| 40 { | 41 { | 
| 41 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 42 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 
| 42    char msg[16]; | 43    char msg[16]; | 
| 43    if (png_ptr != NULL) | 44    if (png_ptr != NULL) | 
| 44    { | 45    { | 
| 45       if (png_ptr->flags& | 46       if ((png_ptr->flags & | 
| 46          (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | 47          (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0 | 
| 47       { | 48       { | 
| 48          if (*error_message == PNG_LITERAL_SHARP) | 49          if (*error_message == PNG_LITERAL_SHARP) | 
| 49          { | 50          { | 
| 50             /* Strip "#nnnn " from beginning of error message. */ | 51             /* Strip "#nnnn " from beginning of error message. */ | 
| 51             int offset; | 52             int offset; | 
| 52             for (offset = 1; offset<15; offset++) | 53             for (offset = 1; offset<15; offset++) | 
| 53                if (error_message[offset] == ' ') | 54                if (error_message[offset] == ' ') | 
| 54                   break; | 55                   break; | 
| 55 | 56 | 
| 56             if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) | 57             if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0) | 
| 57             { | 58             { | 
| 58                int i; | 59                int i; | 
| 59                for (i = 0; i < offset - 1; i++) | 60                for (i = 0; i < offset - 1; i++) | 
| 60                   msg[i] = error_message[i + 1]; | 61                   msg[i] = error_message[i + 1]; | 
| 61                msg[i - 1] = '\0'; | 62                msg[i - 1] = '\0'; | 
| 62                error_message = msg; | 63                error_message = msg; | 
| 63             } | 64             } | 
| 64 | 65 | 
| 65             else | 66             else | 
| 66                error_message += offset; | 67                error_message += offset; | 
| 67       } | 68       } | 
| 68 | 69 | 
| 69       else | 70       else | 
| 70       { | 71       { | 
| 71          if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) | 72          if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0) | 
| 72          { | 73          { | 
| 73             msg[0] = '0'; | 74             msg[0] = '0'; | 
| 74             msg[1] = '\0'; | 75             msg[1] = '\0'; | 
| 75             error_message = msg; | 76             error_message = msg; | 
| 76          } | 77          } | 
| 77        } | 78        } | 
| 78      } | 79      } | 
| 79    } | 80    } | 
| 80 #endif | 81 #endif | 
| 81    if (png_ptr != NULL && png_ptr->error_fn != NULL) | 82    if (png_ptr != NULL && png_ptr->error_fn != NULL) | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 95     * apparently an error, introduced in libpng-1.2.20, and png_default_error | 96     * apparently an error, introduced in libpng-1.2.20, and png_default_error | 
| 96     * will crash in this case. | 97     * will crash in this case. | 
| 97     */ | 98     */ | 
| 98    if (png_ptr != NULL && png_ptr->error_fn != NULL) | 99    if (png_ptr != NULL && png_ptr->error_fn != NULL) | 
| 99       (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), ""); | 100       (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), ""); | 
| 100 | 101 | 
| 101    /* If the custom handler doesn't exist, or if it returns, | 102    /* If the custom handler doesn't exist, or if it returns, | 
| 102       use the default handler, which will not return. */ | 103       use the default handler, which will not return. */ | 
| 103    png_default_error(png_ptr, ""); | 104    png_default_error(png_ptr, ""); | 
| 104 } | 105 } | 
| 105 #endif /* PNG_ERROR_TEXT_SUPPORTED */ | 106 #endif /* ERROR_TEXT */ | 
| 106 | 107 | 
| 107 /* Utility to safely appends strings to a buffer.  This never errors out so | 108 /* Utility to safely appends strings to a buffer.  This never errors out so | 
| 108  * error checking is not required in the caller. | 109  * error checking is not required in the caller. | 
| 109  */ | 110  */ | 
| 110 size_t | 111 size_t | 
| 111 png_safecat(png_charp buffer, size_t bufsize, size_t pos, | 112 png_safecat(png_charp buffer, size_t bufsize, size_t pos, | 
| 112    png_const_charp string) | 113    png_const_charp string) | 
| 113 { | 114 { | 
| 114    if (buffer != NULL && pos < bufsize) | 115    if (buffer != NULL && pos < bufsize) | 
| 115    { | 116    { | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 144    while (end > start && (number != 0 || count < mincount)) | 145    while (end > start && (number != 0 || count < mincount)) | 
| 145    { | 146    { | 
| 146 | 147 | 
| 147       static const char digits[] = "0123456789ABCDEF"; | 148       static const char digits[] = "0123456789ABCDEF"; | 
| 148 | 149 | 
| 149       switch (format) | 150       switch (format) | 
| 150       { | 151       { | 
| 151          case PNG_NUMBER_FORMAT_fixed: | 152          case PNG_NUMBER_FORMAT_fixed: | 
| 152             /* Needs five digits (the fraction) */ | 153             /* Needs five digits (the fraction) */ | 
| 153             mincount = 5; | 154             mincount = 5; | 
| 154             if (output || number % 10 != 0) | 155             if (output != 0 || number % 10 != 0) | 
| 155             { | 156             { | 
| 156                *--end = digits[number % 10]; | 157                *--end = digits[number % 10]; | 
| 157                output = 1; | 158                output = 1; | 
| 158             } | 159             } | 
| 159             number /= 10; | 160             number /= 10; | 
| 160             break; | 161             break; | 
| 161 | 162 | 
| 162          case PNG_NUMBER_FORMAT_02u: | 163          case PNG_NUMBER_FORMAT_02u: | 
| 163             /* Expects at least 2 digits. */ | 164             /* Expects at least 2 digits. */ | 
| 164             mincount = 2; | 165             mincount = 2; | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 181 | 182 | 
| 182          default: /* an error */ | 183          default: /* an error */ | 
| 183             number = 0; | 184             number = 0; | 
| 184             break; | 185             break; | 
| 185       } | 186       } | 
| 186 | 187 | 
| 187       /* Keep track of the number of digits added */ | 188       /* Keep track of the number of digits added */ | 
| 188       ++count; | 189       ++count; | 
| 189 | 190 | 
| 190       /* Float a fixed number here: */ | 191       /* Float a fixed number here: */ | 
| 191       if (format == PNG_NUMBER_FORMAT_fixed) if (count == 5) if (end > start) | 192       if ((format == PNG_NUMBER_FORMAT_fixed) && (count == 5) && (end > start)) | 
| 192       { | 193       { | 
| 193          /* End of the fraction, but maybe nothing was output?  In that case | 194          /* End of the fraction, but maybe nothing was output?  In that case | 
| 194           * drop the decimal point.  If the number is a true zero handle that | 195           * drop the decimal point.  If the number is a true zero handle that | 
| 195           * here. | 196           * here. | 
| 196           */ | 197           */ | 
| 197          if (output) | 198          if (output != 0) | 
| 198             *--end = '.'; | 199             *--end = '.'; | 
| 199          else if (number == 0) /* and !output */ | 200          else if (number == 0) /* and !output */ | 
| 200             *--end = '0'; | 201             *--end = '0'; | 
| 201       } | 202       } | 
| 202    } | 203    } | 
| 203 | 204 | 
| 204    return end; | 205    return end; | 
| 205 } | 206 } | 
| 206 #endif | 207 #endif | 
| 207 | 208 | 
| 208 #ifdef PNG_WARNINGS_SUPPORTED | 209 #ifdef PNG_WARNINGS_SUPPORTED | 
| 209 /* This function is called whenever there is a non-fatal error.  This function | 210 /* This function is called whenever there is a non-fatal error.  This function | 
| 210  * should not be changed.  If there is a need to handle warnings differently, | 211  * should not be changed.  If there is a need to handle warnings differently, | 
| 211  * you should supply a replacement warning function and use | 212  * you should supply a replacement warning function and use | 
| 212  * png_set_error_fn() to replace the warning function at run-time. | 213  * png_set_error_fn() to replace the warning function at run-time. | 
| 213  */ | 214  */ | 
| 214 void PNGAPI | 215 void PNGAPI | 
| 215 png_warning(png_const_structrp png_ptr, png_const_charp warning_message) | 216 png_warning(png_const_structrp png_ptr, png_const_charp warning_message) | 
| 216 { | 217 { | 
| 217    int offset = 0; | 218    int offset = 0; | 
| 218    if (png_ptr != NULL) | 219    if (png_ptr != NULL) | 
| 219    { | 220    { | 
| 220 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 221 #ifdef PNG_ERROR_NUMBERS_SUPPORTED | 
| 221    if (png_ptr->flags& | 222    if ((png_ptr->flags & | 
| 222        (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | 223        (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0) | 
| 223 #endif | 224 #endif | 
| 224       { | 225       { | 
| 225          if (*warning_message == PNG_LITERAL_SHARP) | 226          if (*warning_message == PNG_LITERAL_SHARP) | 
| 226          { | 227          { | 
| 227             for (offset = 1; offset < 15; offset++) | 228             for (offset = 1; offset < 15; offset++) | 
| 228                if (warning_message[offset] == ' ') | 229                if (warning_message[offset] == ' ') | 
| 229                   break; | 230                   break; | 
| 230          } | 231          } | 
| 231       } | 232       } | 
| 232    } | 233    } | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 347 | 348 | 
| 348    /* i is always less than (sizeof msg), so: */ | 349    /* i is always less than (sizeof msg), so: */ | 
| 349    msg[i] = '\0'; | 350    msg[i] = '\0'; | 
| 350 | 351 | 
| 351    /* And this is the formatted message. It may be larger than | 352    /* And this is the formatted message. It may be larger than | 
| 352     * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these | 353     * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these | 
| 353     * are not (currently) formatted. | 354     * are not (currently) formatted. | 
| 354     */ | 355     */ | 
| 355    png_warning(png_ptr, msg); | 356    png_warning(png_ptr, msg); | 
| 356 } | 357 } | 
| 357 #endif /* PNG_WARNINGS_SUPPORTED */ | 358 #endif /* WARNINGS */ | 
| 358 | 359 | 
| 359 #ifdef PNG_BENIGN_ERRORS_SUPPORTED | 360 #ifdef PNG_BENIGN_ERRORS_SUPPORTED | 
| 360 void PNGAPI | 361 void PNGAPI | 
| 361 png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) | 362 png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) | 
| 362 { | 363 { | 
| 363    if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) | 364    if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) | 
| 364    { | 365    { | 
| 365 #     ifdef PNG_READ_SUPPORTED | 366 #     ifdef PNG_READ_SUPPORTED | 
| 366          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | 367          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | 
| 367             png_ptr->chunk_name != 0) | 368             png_ptr->chunk_name != 0) | 
| 368             png_chunk_warning(png_ptr, error_message); | 369             png_chunk_warning(png_ptr, error_message); | 
| 369          else | 370          else | 
| 370 #     endif | 371 #     endif | 
| 371       png_warning(png_ptr, error_message); | 372       png_warning(png_ptr, error_message); | 
| 372    } | 373    } | 
| 373 | 374 | 
| 374    else | 375    else | 
| 375    { | 376    { | 
| 376 #     ifdef PNG_READ_SUPPORTED | 377 #     ifdef PNG_READ_SUPPORTED | 
| 377          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | 378          if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && | 
| 378             png_ptr->chunk_name != 0) | 379             png_ptr->chunk_name != 0) | 
| 379             png_chunk_error(png_ptr, error_message); | 380             png_chunk_error(png_ptr, error_message); | 
| 380          else | 381          else | 
| 381 #     endif | 382 #     endif | 
| 382       png_error(png_ptr, error_message); | 383       png_error(png_ptr, error_message); | 
| 383    } | 384    } | 
|  | 385 | 
|  | 386 #  ifndef PNG_ERROR_TEXT_SUPPORTED | 
|  | 387       PNG_UNUSED(error_message) | 
|  | 388 #  endif | 
| 384 } | 389 } | 
| 385 | 390 | 
| 386 void /* PRIVATE */ | 391 void /* PRIVATE */ | 
| 387 png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) | 392 png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) | 
| 388 { | 393 { | 
| 389   if (png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) | 394   if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0) | 
| 390      png_warning(png_ptr, error_message); | 395      png_warning(png_ptr, error_message); | 
| 391   else | 396   else | 
| 392      png_error(png_ptr, error_message); | 397      png_error(png_ptr, error_message); | 
|  | 398 | 
|  | 399 #  ifndef PNG_ERROR_TEXT_SUPPORTED | 
|  | 400       PNG_UNUSED(error_message) | 
|  | 401 #  endif | 
| 393 } | 402 } | 
| 394 | 403 | 
| 395 void /* PRIVATE */ | 404 void /* PRIVATE */ | 
| 396 png_app_error(png_const_structrp png_ptr, png_const_charp error_message) | 405 png_app_error(png_const_structrp png_ptr, png_const_charp error_message) | 
| 397 { | 406 { | 
| 398   if (png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) | 407   if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0) | 
| 399      png_warning(png_ptr, error_message); | 408      png_warning(png_ptr, error_message); | 
| 400   else | 409   else | 
| 401      png_error(png_ptr, error_message); | 410      png_error(png_ptr, error_message); | 
|  | 411 | 
|  | 412 #  ifndef PNG_ERROR_TEXT_SUPPORTED | 
|  | 413       PNG_UNUSED(error_message) | 
|  | 414 #  endif | 
| 402 } | 415 } | 
| 403 #endif /* BENIGN_ERRORS */ | 416 #endif /* BENIGN_ERRORS */ | 
| 404 | 417 | 
|  | 418 #define PNG_MAX_ERROR_TEXT 196 /* Currently limited by profile_error in png.c */ | 
|  | 419 #if defined(PNG_WARNINGS_SUPPORTED) || \ | 
|  | 420    (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)) | 
| 405 /* These utilities are used internally to build an error message that relates | 421 /* These utilities are used internally to build an error message that relates | 
| 406  * to the current chunk.  The chunk name comes from png_ptr->chunk_name, | 422  * to the current chunk.  The chunk name comes from png_ptr->chunk_name, | 
| 407  * this is used to prefix the message.  The message is limited in length | 423  * which is used to prefix the message.  The message is limited in length | 
| 408  * to 63 bytes, the name characters are output as hex digits wrapped in [] | 424  * to 63 bytes. The name characters are output as hex digits wrapped in [] | 
| 409  * if the character is invalid. | 425  * if the character is invalid. | 
| 410  */ | 426  */ | 
| 411 #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) | 427 #define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) | 
| 412 static PNG_CONST char png_digit[16] = { | 428 static PNG_CONST char png_digit[16] = { | 
| 413    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', | 429    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', | 
| 414    'A', 'B', 'C', 'D', 'E', 'F' | 430    'A', 'B', 'C', 'D', 'E', 'F' | 
| 415 }; | 431 }; | 
| 416 | 432 | 
| 417 #define PNG_MAX_ERROR_TEXT 196 /* Currently limited be profile_error in png.c */ |  | 
| 418 #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) |  | 
| 419 static void /* PRIVATE */ | 433 static void /* PRIVATE */ | 
| 420 png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp | 434 png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp | 
| 421     error_message) | 435     error_message) | 
| 422 { | 436 { | 
| 423    png_uint_32 chunk_name = png_ptr->chunk_name; | 437    png_uint_32 chunk_name = png_ptr->chunk_name; | 
| 424    int iout = 0, ishift = 24; | 438    int iout = 0, ishift = 24; | 
| 425 | 439 | 
| 426    while (ishift >= 0) | 440    while (ishift >= 0) | 
| 427    { | 441    { | 
| 428       int c = (int)(chunk_name >> ishift) & 0xff; | 442       int c = (int)(chunk_name >> ishift) & 0xff; | 
| 429 | 443 | 
| 430       ishift -= 8; | 444       ishift -= 8; | 
| 431       if (isnonalpha(c)) | 445       if (isnonalpha(c) != 0) | 
| 432       { | 446       { | 
| 433          buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; | 447          buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; | 
| 434          buffer[iout++] = png_digit[(c & 0xf0) >> 4]; | 448          buffer[iout++] = png_digit[(c & 0xf0) >> 4]; | 
| 435          buffer[iout++] = png_digit[c & 0x0f]; | 449          buffer[iout++] = png_digit[c & 0x0f]; | 
| 436          buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; | 450          buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; | 
| 437       } | 451       } | 
| 438 | 452 | 
| 439       else | 453       else | 
| 440       { | 454       { | 
| 441          buffer[iout++] = (char)c; | 455          buffer[iout++] = (char)c; | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 452       buffer[iout++] = ':'; | 466       buffer[iout++] = ':'; | 
| 453       buffer[iout++] = ' '; | 467       buffer[iout++] = ' '; | 
| 454 | 468 | 
| 455       while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0') | 469       while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0') | 
| 456          buffer[iout++] = error_message[iin++]; | 470          buffer[iout++] = error_message[iin++]; | 
| 457 | 471 | 
| 458       /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */ | 472       /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */ | 
| 459       buffer[iout] = '\0'; | 473       buffer[iout] = '\0'; | 
| 460    } | 474    } | 
| 461 } | 475 } | 
| 462 #endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ | 476 #endif /* WARNINGS || ERROR_TEXT */ | 
| 463 | 477 | 
| 464 #if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) | 478 #if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) | 
| 465 PNG_FUNCTION(void,PNGAPI | 479 PNG_FUNCTION(void,PNGAPI | 
| 466 png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message), | 480 png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message), | 
| 467    PNG_NORETURN) | 481    PNG_NORETURN) | 
| 468 { | 482 { | 
| 469    char msg[18+PNG_MAX_ERROR_TEXT]; | 483    char msg[18+PNG_MAX_ERROR_TEXT]; | 
| 470    if (png_ptr == NULL) | 484    if (png_ptr == NULL) | 
| 471       png_error(png_ptr, error_message); | 485       png_error(png_ptr, error_message); | 
| 472 | 486 | 
| 473    else | 487    else | 
| 474    { | 488    { | 
| 475       png_format_buffer(png_ptr, msg, error_message); | 489       png_format_buffer(png_ptr, msg, error_message); | 
| 476       png_error(png_ptr, msg); | 490       png_error(png_ptr, msg); | 
| 477    } | 491    } | 
| 478 } | 492 } | 
| 479 #endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */ | 493 #endif /* READ && ERROR_TEXT */ | 
| 480 | 494 | 
| 481 #ifdef PNG_WARNINGS_SUPPORTED | 495 #ifdef PNG_WARNINGS_SUPPORTED | 
| 482 void PNGAPI | 496 void PNGAPI | 
| 483 png_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message) | 497 png_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message) | 
| 484 { | 498 { | 
| 485    char msg[18+PNG_MAX_ERROR_TEXT]; | 499    char msg[18+PNG_MAX_ERROR_TEXT]; | 
| 486    if (png_ptr == NULL) | 500    if (png_ptr == NULL) | 
| 487       png_warning(png_ptr, warning_message); | 501       png_warning(png_ptr, warning_message); | 
| 488 | 502 | 
| 489    else | 503    else | 
| 490    { | 504    { | 
| 491       png_format_buffer(png_ptr, msg, warning_message); | 505       png_format_buffer(png_ptr, msg, warning_message); | 
| 492       png_warning(png_ptr, msg); | 506       png_warning(png_ptr, msg); | 
| 493    } | 507    } | 
| 494 } | 508 } | 
| 495 #endif /* PNG_WARNINGS_SUPPORTED */ | 509 #endif /* WARNINGS */ | 
| 496 | 510 | 
| 497 #ifdef PNG_READ_SUPPORTED | 511 #ifdef PNG_READ_SUPPORTED | 
| 498 #ifdef PNG_BENIGN_ERRORS_SUPPORTED | 512 #ifdef PNG_BENIGN_ERRORS_SUPPORTED | 
| 499 void PNGAPI | 513 void PNGAPI | 
| 500 png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp | 514 png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp | 
| 501     error_message) | 515     error_message) | 
| 502 { | 516 { | 
| 503    if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) | 517    if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0) | 
| 504       png_chunk_warning(png_ptr, error_message); | 518       png_chunk_warning(png_ptr, error_message); | 
| 505 | 519 | 
| 506    else | 520    else | 
| 507       png_chunk_error(png_ptr, error_message); | 521       png_chunk_error(png_ptr, error_message); | 
| 508 } | 522 | 
| 509 #endif | 523 #  ifndef PNG_ERROR_TEXT_SUPPORTED | 
| 510 #endif /* PNG_READ_SUPPORTED */ | 524       PNG_UNUSED(error_message) | 
|  | 525 #  endif | 
|  | 526 } | 
|  | 527 #endif | 
|  | 528 #endif /* READ */ | 
| 511 | 529 | 
| 512 void /* PRIVATE */ | 530 void /* PRIVATE */ | 
| 513 png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) | 531 png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) | 
| 514 { | 532 { | 
|  | 533 #  ifndef PNG_WARNINGS_SUPPORTED | 
|  | 534       PNG_UNUSED(message) | 
|  | 535 #  endif | 
|  | 536 | 
| 515    /* This is always supported, but for just read or just write it | 537    /* This is always supported, but for just read or just write it | 
| 516     * unconditionally does the right thing. | 538     * unconditionally does the right thing. | 
| 517     */ | 539     */ | 
| 518 #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | 540 #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | 
| 519       if (png_ptr->mode & PNG_IS_READ_STRUCT) | 541       if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0) | 
| 520 #  endif | 542 #  endif | 
| 521 | 543 | 
| 522 #  ifdef PNG_READ_SUPPORTED | 544 #  ifdef PNG_READ_SUPPORTED | 
| 523       { | 545       { | 
| 524          if (error < PNG_CHUNK_ERROR) | 546          if (error < PNG_CHUNK_ERROR) | 
| 525             png_chunk_warning(png_ptr, message); | 547             png_chunk_warning(png_ptr, message); | 
| 526 | 548 | 
| 527          else | 549          else | 
| 528             png_chunk_benign_error(png_ptr, message); | 550             png_chunk_benign_error(png_ptr, message); | 
| 529       } | 551       } | 
| 530 #  endif | 552 #  endif | 
| 531 | 553 | 
| 532 #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | 554 #  if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) | 
| 533       else if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) | 555       else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0) | 
| 534 #  endif | 556 #  endif | 
| 535 | 557 | 
| 536 #  ifdef PNG_WRITE_SUPPORTED | 558 #  ifdef PNG_WRITE_SUPPORTED | 
| 537       { | 559       { | 
| 538          if (error < PNG_CHUNK_WRITE_ERROR) | 560          if (error < PNG_CHUNK_WRITE_ERROR) | 
| 539             png_app_warning(png_ptr, message); | 561             png_app_warning(png_ptr, message); | 
| 540 | 562 | 
| 541          else | 563          else | 
| 542             png_app_error(png_ptr, message); | 564             png_app_error(png_ptr, message); | 
| 543       } | 565       } | 
| 544 #  endif | 566 #  endif | 
| 545 } | 567 } | 
| 546 | 568 | 
| 547 #ifdef PNG_ERROR_TEXT_SUPPORTED | 569 #ifdef PNG_ERROR_TEXT_SUPPORTED | 
| 548 #ifdef PNG_FLOATING_POINT_SUPPORTED | 570 #ifdef PNG_FLOATING_POINT_SUPPORTED | 
| 549 PNG_FUNCTION(void, | 571 PNG_FUNCTION(void, | 
| 550 png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN) | 572 png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN) | 
| 551 { | 573 { | 
| 552 #  define fixed_message "fixed point overflow in " | 574 #  define fixed_message "fixed point overflow in " | 
| 553 #  define fixed_message_ln ((sizeof fixed_message)-1) | 575 #  define fixed_message_ln ((sizeof fixed_message)-1) | 
| 554    int  iin; | 576    int  iin; | 
| 555    char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; | 577    char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; | 
| 556    memcpy(msg, fixed_message, fixed_message_ln); | 578    memcpy(msg, fixed_message, fixed_message_ln); | 
| 557    iin = 0; | 579    iin = 0; | 
| 558    if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) | 580    if (name != NULL) | 
| 559    { | 581       while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) | 
| 560       msg[fixed_message_ln + iin] = name[iin]; | 582       { | 
| 561       ++iin; | 583          msg[fixed_message_ln + iin] = name[iin]; | 
| 562    } | 584          ++iin; | 
|  | 585       } | 
| 563    msg[fixed_message_ln + iin] = 0; | 586    msg[fixed_message_ln + iin] = 0; | 
| 564    png_error(png_ptr, msg); | 587    png_error(png_ptr, msg); | 
| 565 } | 588 } | 
| 566 #endif | 589 #endif | 
| 567 #endif | 590 #endif | 
| 568 | 591 | 
| 569 #ifdef PNG_SETJMP_SUPPORTED | 592 #ifdef PNG_SETJMP_SUPPORTED | 
| 570 /* This API only exists if ANSI-C style error handling is used, | 593 /* This API only exists if ANSI-C style error handling is used, | 
| 571  * otherwise it is necessary for png_default_error to be overridden. | 594  * otherwise it is necessary for png_default_error to be overridden. | 
| 572  */ | 595  */ | 
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 728 #else | 751 #else | 
| 729    PNG_UNUSED(error_message) /* Make compiler happy */ | 752    PNG_UNUSED(error_message) /* Make compiler happy */ | 
| 730 #endif | 753 #endif | 
| 731    png_longjmp(png_ptr, 1); | 754    png_longjmp(png_ptr, 1); | 
| 732 } | 755 } | 
| 733 | 756 | 
| 734 PNG_FUNCTION(void,PNGAPI | 757 PNG_FUNCTION(void,PNGAPI | 
| 735 png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN) | 758 png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN) | 
| 736 { | 759 { | 
| 737 #ifdef PNG_SETJMP_SUPPORTED | 760 #ifdef PNG_SETJMP_SUPPORTED | 
| 738    if (png_ptr && png_ptr->longjmp_fn && png_ptr->jmp_buf_ptr) | 761    if (png_ptr != NULL && png_ptr->longjmp_fn != NULL && | 
|  | 762        png_ptr->jmp_buf_ptr != NULL) | 
| 739       png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val); | 763       png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val); | 
| 740 #endif | 764 #else | 
| 741 | 765    PNG_UNUSED(png_ptr) | 
| 742    /* Here if not setjmp support or if png_ptr is null. */ | 766    PNG_UNUSED(val) | 
|  | 767 #endif | 
|  | 768 | 
|  | 769    /* If control reaches this point, png_longjmp() must not return. The only | 
|  | 770     * choice is to terminate the whole process (or maybe the thread); to do | 
|  | 771     * this the ANSI-C abort() function is used unless a different method is | 
|  | 772     * implemented by overriding the default configuration setting for | 
|  | 773     * PNG_ABORT(). | 
|  | 774     */ | 
| 743    PNG_ABORT(); | 775    PNG_ABORT(); | 
| 744 } | 776 } | 
| 745 | 777 | 
| 746 #ifdef PNG_WARNINGS_SUPPORTED | 778 #ifdef PNG_WARNINGS_SUPPORTED | 
| 747 /* This function is called when there is a warning, but the library thinks | 779 /* This function is called when there is a warning, but the library thinks | 
| 748  * it can continue anyway.  Replacement functions don't have to do anything | 780  * it can continue anyway.  Replacement functions don't have to do anything | 
| 749  * here if you don't want them to.  In the default configuration, png_ptr is | 781  * here if you don't want them to.  In the default configuration, png_ptr is | 
| 750  * not used, but it is passed in case it may be useful. | 782  * not used, but it is passed in case it may be useful. | 
| 751  */ | 783  */ | 
| 752 static void /* PRIVATE */ | 784 static void /* PRIVATE */ | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 785 | 817 | 
| 786    { | 818    { | 
| 787       fprintf(stderr, "libpng warning: %s", warning_message); | 819       fprintf(stderr, "libpng warning: %s", warning_message); | 
| 788       fprintf(stderr, PNG_STRING_NEWLINE); | 820       fprintf(stderr, PNG_STRING_NEWLINE); | 
| 789    } | 821    } | 
| 790 #else | 822 #else | 
| 791    PNG_UNUSED(warning_message) /* Make compiler happy */ | 823    PNG_UNUSED(warning_message) /* Make compiler happy */ | 
| 792 #endif | 824 #endif | 
| 793    PNG_UNUSED(png_ptr) /* Make compiler happy */ | 825    PNG_UNUSED(png_ptr) /* Make compiler happy */ | 
| 794 } | 826 } | 
| 795 #endif /* PNG_WARNINGS_SUPPORTED */ | 827 #endif /* WARNINGS */ | 
| 796 | 828 | 
| 797 /* This function is called when the application wants to use another method | 829 /* This function is called when the application wants to use another method | 
| 798  * of handling errors and warnings.  Note that the error function MUST NOT | 830  * of handling errors and warnings.  Note that the error function MUST NOT | 
| 799  * return to the calling routine or serious problems will occur.  The return | 831  * return to the calling routine or serious problems will occur.  The return | 
| 800  * method used in the default routine calls longjmp(png_ptr->jmp_buf_ptr, 1) | 832  * method used in the default routine calls longjmp(png_ptr->jmp_buf_ptr, 1) | 
| 801  */ | 833  */ | 
| 802 void PNGAPI | 834 void PNGAPI | 
| 803 png_set_error_fn(png_structrp png_ptr, png_voidp error_ptr, | 835 png_set_error_fn(png_structrp png_ptr, png_voidp error_ptr, | 
| 804     png_error_ptr error_fn, png_error_ptr warning_fn) | 836     png_error_ptr error_fn, png_error_ptr warning_fn) | 
| 805 { | 837 { | 
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 842    } | 874    } | 
| 843 } | 875 } | 
| 844 #endif | 876 #endif | 
| 845 | 877 | 
| 846 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ | 878 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ | 
| 847    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) | 879    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) | 
| 848    /* Currently the above both depend on SETJMP_SUPPORTED, however it would be | 880    /* Currently the above both depend on SETJMP_SUPPORTED, however it would be | 
| 849     * possible to implement without setjmp support just so long as there is some | 881     * possible to implement without setjmp support just so long as there is some | 
| 850     * way to handle the error return here: | 882     * way to handle the error return here: | 
| 851     */ | 883     */ | 
| 852 PNG_FUNCTION(void /* PRIVATE */, | 884 PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI | 
| 853 png_safe_error,(png_structp png_nonconst_ptr, png_const_charp error_message), | 885 png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message), | 
| 854    PNG_NORETURN) | 886    PNG_NORETURN) | 
| 855 { | 887 { | 
| 856    const png_const_structrp png_ptr = png_nonconst_ptr; | 888    const png_const_structrp png_ptr = png_nonconst_ptr; | 
| 857    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | 889    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | 
| 858 | 890 | 
| 859    /* An error is always logged here, overwriting anything (typically a warning) | 891    /* An error is always logged here, overwriting anything (typically a warning) | 
| 860     * that is already there: | 892     * that is already there: | 
| 861     */ | 893     */ | 
| 862    if (image != NULL) | 894    if (image != NULL) | 
| 863    { | 895    { | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 878          png_safecat(image->message, (sizeof image->message), pos, | 910          png_safecat(image->message, (sizeof image->message), pos, | 
| 879              error_message); | 911              error_message); | 
| 880       } | 912       } | 
| 881    } | 913    } | 
| 882 | 914 | 
| 883    /* Here on an internal programming error. */ | 915    /* Here on an internal programming error. */ | 
| 884    abort(); | 916    abort(); | 
| 885 } | 917 } | 
| 886 | 918 | 
| 887 #ifdef PNG_WARNINGS_SUPPORTED | 919 #ifdef PNG_WARNINGS_SUPPORTED | 
| 888 void /* PRIVATE */ | 920 void /* PRIVATE */ PNGCBAPI | 
| 889 png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message) | 921 png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message) | 
| 890 { | 922 { | 
| 891    const png_const_structrp png_ptr = png_nonconst_ptr; | 923    const png_const_structrp png_ptr = png_nonconst_ptr; | 
| 892    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | 924    png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); | 
| 893 | 925 | 
| 894    /* A warning is only logged if there is no prior warning or error. */ | 926    /* A warning is only logged if there is no prior warning or error. */ | 
| 895    if (image->warning_or_error == 0) | 927    if (image->warning_or_error == 0) | 
| 896    { | 928    { | 
| 897       png_safecat(image->message, (sizeof image->message), 0, warning_message); | 929       png_safecat(image->message, (sizeof image->message), 0, warning_message); | 
| 898       image->warning_or_error |= PNG_IMAGE_WARNING; | 930       image->warning_or_error |= PNG_IMAGE_WARNING; | 
| 899    } | 931    } | 
| 900 } | 932 } | 
| 901 #endif | 933 #endif | 
| 902 | 934 | 
| 903 int /* PRIVATE */ | 935 int /* PRIVATE */ | 
| 904 png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg) | 936 png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg) | 
| 905 { | 937 { | 
| 906    volatile png_imagep image = image_in; | 938    volatile png_imagep image = image_in; | 
| 907    volatile int result; | 939    volatile int result; | 
| 908    volatile png_voidp saved_error_buf; | 940    volatile png_voidp saved_error_buf; | 
| 909    jmp_buf safe_jmpbuf; | 941    jmp_buf safe_jmpbuf; | 
| 910 | 942 | 
| 911    /* Safely execute function(arg) with png_error returning to this function. */ | 943    /* Safely execute function(arg) with png_error returning to this function. */ | 
| 912    saved_error_buf = image->opaque->error_buf; | 944    saved_error_buf = image->opaque->error_buf; | 
| 913    result = setjmp(safe_jmpbuf) == 0; | 945    result = setjmp(safe_jmpbuf) == 0; | 
| 914 | 946 | 
| 915    if (result) | 947    if (result != 0) | 
| 916    { | 948    { | 
| 917 | 949 | 
| 918       image->opaque->error_buf = safe_jmpbuf; | 950       image->opaque->error_buf = safe_jmpbuf; | 
| 919       result = function(arg); | 951       result = function(arg); | 
| 920    } | 952    } | 
| 921 | 953 | 
| 922    image->opaque->error_buf = saved_error_buf; | 954    image->opaque->error_buf = saved_error_buf; | 
| 923 | 955 | 
| 924    /* And do the cleanup prior to any failure return. */ | 956    /* And do the cleanup prior to any failure return. */ | 
| 925    if (!result) | 957    if (result == 0) | 
| 926       png_image_free(image); | 958       png_image_free(image); | 
| 927 | 959 | 
| 928    return result; | 960    return result; | 
| 929 } | 961 } | 
| 930 #endif /* SIMPLIFIED READ/WRITE */ | 962 #endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */ | 
| 931 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ | 963 #endif /* READ || WRITE */ | 
| OLD | NEW | 
|---|