Home | History | Annotate | Download | only in tools
      1 /* pngfix.c
      2  *
      3  * Copyright (c) 2014 John Cunningham Bowler
      4  *
      5  * Last changed in libpng 1.6.10 [March 6, 2014]
      6  *
      7  * This code is released under the libpng license.
      8  * For conditions of distribution and use, see the disclaimer
      9  * and license in png.h
     10  *
     11  * Tool to check and fix the zlib inflate 'too far back' problem, see the usage
     12  * message for more information.
     13  */
     14 #include <stdlib.h>
     15 #include <stdio.h>
     16 #include <string.h>
     17 #include <ctype.h>
     18 #include <limits.h>
     19 #include <errno.h>
     20 #include <assert.h>
     21 
     22 #define implies(x,y) assert(!(x) || (y))
     23 
     24 #ifdef __GNUC__
     25    /* This is used to fix the error:
     26     *
     27     * pngfix.c:
     28     * In function 'zlib_advance':
     29     * pngfix.c:181:13: error: assuming signed overflow does not
     30     *   occur when simplifying conditional to constant [-Werror=strict-overflow]
     31     */
     32 #  define FIX_GCC volatile
     33 #else
     34 #  define FIX_GCC
     35 #endif
     36 
     37 #define PROGRAM_NAME "pngfix"
     38 
     39 /* Define the following to use this program against your installed libpng,
     40  * rather than the one being built here:
     41  */
     42 #ifdef PNG_FREESTANDING_TESTS
     43 #  include <png.h>
     44 #else
     45 #  include "../../png.h"
     46 #endif
     47 
     48 #if PNG_LIBPNG_VER < 10603 /* 1.6.3 */
     49 #  error "pngfix will not work with libpng prior to 1.6.3"
     50 #endif
     51 
     52 #if defined(PNG_READ_SUPPORTED) && defined(PNG_EASY_ACCESS_SUPPORTED)
     53 /* zlib.h defines the structure z_stream, an instance of which is included
     54  * in this structure and is required for decompressing the LZ compressed
     55  * data in PNG files.
     56  */
     57 #ifndef ZLIB_CONST
     58    /* We must ensure that zlib uses 'const' in declarations. */
     59 #  define ZLIB_CONST
     60 #endif
     61 #include <zlib.h>
     62 #ifdef const
     63    /* zlib.h sometimes #defines const to nothing, undo this. */
     64 #  undef const
     65 #endif
     66 
     67 /* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility
     68  * with older builds.
     69  */
     70 #if ZLIB_VERNUM < 0x1260
     71 #  define PNGZ_MSG_CAST(s) png_constcast(char*,s)
     72 #  define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b)
     73 #else
     74 #  define PNGZ_MSG_CAST(s) (s)
     75 #  define PNGZ_INPUT_CAST(b) (b)
     76 #endif
     77 
     78 #ifndef PNG_MAXIMUM_INFLATE_WINDOW
     79 #  error "pngfix not supported in this libpng version"
     80 #endif
     81 
     82 #if PNG_ZLIB_VERNUM >= 0x1240
     83 
     84 /* Copied from pngpriv.h */
     85 #ifdef __cplusplus
     86 #  define png_voidcast(type, value) static_cast<type>(value)
     87 #  define png_constcast(type, value) const_cast<type>(value)
     88 #  define png_aligncast(type, value) \
     89    static_cast<type>(static_cast<void*>(value))
     90 #  define png_aligncastconst(type, value) \
     91    static_cast<type>(static_cast<const void*>(value))
     92 #else
     93 #  define png_voidcast(type, value) (value)
     94 #  define png_constcast(type, value) ((type)(value))
     95 #  define png_aligncast(type, value) ((void*)(value))
     96 #  define png_aligncastconst(type, value) ((const void*)(value))
     97 #endif /* __cplusplus */
     98 
     99 #if PNG_LIBPNG_VER < 10700
    100 /* Chunk tags (copied from pngpriv.h) */
    101 #define PNG_32b(b,s) ((png_uint_32)(b) << (s))
    102 #define PNG_U32(b1,b2,b3,b4) \
    103    (PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))
    104 
    105 /* Constants for known chunk types. */
    106 #define png_IDAT PNG_U32( 73,  68,  65,  84)
    107 #define png_IEND PNG_U32( 73,  69,  78,  68)
    108 #define png_IHDR PNG_U32( 73,  72,  68,  82)
    109 #define png_PLTE PNG_U32( 80,  76,  84,  69)
    110 #define png_bKGD PNG_U32( 98,  75,  71,  68)
    111 #define png_cHRM PNG_U32( 99,  72,  82,  77)
    112 #define png_fRAc PNG_U32(102,  82,  65,  99) /* registered, not defined */
    113 #define png_gAMA PNG_U32(103,  65,  77,  65)
    114 #define png_gIFg PNG_U32(103,  73,  70, 103)
    115 #define png_gIFt PNG_U32(103,  73,  70, 116) /* deprecated */
    116 #define png_gIFx PNG_U32(103,  73,  70, 120)
    117 #define png_hIST PNG_U32(104,  73,  83,  84)
    118 #define png_iCCP PNG_U32(105,  67,  67,  80)
    119 #define png_iTXt PNG_U32(105,  84,  88, 116)
    120 #define png_oFFs PNG_U32(111,  70,  70, 115)
    121 #define png_pCAL PNG_U32(112,  67,  65,  76)
    122 #define png_pHYs PNG_U32(112,  72,  89, 115)
    123 #define png_sBIT PNG_U32(115,  66,  73,  84)
    124 #define png_sCAL PNG_U32(115,  67,  65,  76)
    125 #define png_sPLT PNG_U32(115,  80,  76,  84)
    126 #define png_sRGB PNG_U32(115,  82,  71,  66)
    127 #define png_sTER PNG_U32(115,  84,  69,  82)
    128 #define png_tEXt PNG_U32(116,  69,  88, 116)
    129 #define png_tIME PNG_U32(116,  73,  77,  69)
    130 #define png_tRNS PNG_U32(116,  82,  78,  83)
    131 #define png_zTXt PNG_U32(122,  84,  88, 116)
    132 #endif
    133 
    134 /* The 8 byte signature as a pair of 32 bit quantities */
    135 #define sig1 PNG_U32(137,  80,  78,  71)
    136 #define sig2 PNG_U32( 13,  10,  26,  10)
    137 
    138 /* Is the chunk critical? */
    139 #define CRITICAL(chunk) (((chunk) & PNG_U32(32,0,0,0)) == 0)
    140 
    141 /* Is it safe to copy? */
    142 #define SAFE_TO_COPY(chunk) (((chunk) & PNG_U32(0,0,0,32)) != 0)
    143 
    144 /* Fix ups for builds with limited read support */
    145 #ifndef PNG_ERROR_TEXT_SUPPORTED
    146 #  define png_error(a,b) png_err(a)
    147 #endif
    148 
    149 /********************************* UTILITIES **********************************/
    150 /* UNREACHED is a value to cause an assert to fail. Because of the way the
    151  * assert macro is written the string "UNREACHED" is produced in the error
    152  * message.
    153  */
    154 #define UNREACHED 0
    155 
    156 /* 80-bit number handling - a PNG image can be up to (2^31-1)x(2^31-1) 8 byte
    157  * (16-bit RGBA) pixels in size; that's less than 2^65 bytes or 2^68 bits, so
    158  * arithmetic of 80-bit numbers is sufficient.  This representation uses an
    159  * arbitrary length array of png_uint_16 digits (0..65535).  The representation
    160  * is little endian.
    161  *
    162  * The arithmetic functions take zero to two uarb values together with the
    163  * number of digits in those values and write the result to the given uarb
    164  * (always the first argument) returning the number of digits in the result.
    165  * If the result is negative the return value is also negative (this would
    166  * normally be an error).
    167  */
    168 typedef png_uint_16  udigit; /* A 'unum' is an array of these */
    169 typedef png_uint_16p uarb;
    170 typedef png_const_uint_16p uarbc;
    171 
    172 #define UDIGITS(unum) ((sizeof unum)/(sizeof (udigit))
    173    /* IMPORTANT: only apply this to an array, applied to a pointer the result
    174     * will typically be '2', which is not useful.
    175     */
    176 
    177 static int
    178 uarb_set(uarb result, png_alloc_size_t val)
    179    /* Set (initialize) 'result' to 'val'.  The size required for 'result' must
    180     * be determined by the caller from a knowledge of the maximum for 'val'.
    181     */
    182 {
    183    int ndigits = 0;
    184 
    185    while (val > 0)
    186    {
    187       result[ndigits++] = (png_uint_16)(val & 0xffff);
    188       val >>= 16;
    189    }
    190 
    191    return ndigits;
    192 }
    193 
    194 static int
    195 uarb_copy(uarb to, uarb from, int idigits)
    196    /* Copy a uarb, may reduce the digit count */
    197 {
    198    int d, odigits;
    199 
    200    for (d=odigits=0; d<idigits; ++d)
    201       if ((to[d] = from[d]) != 0)
    202          odigits = d+1;
    203 
    204    return odigits;
    205 }
    206 
    207 static int
    208 uarb_inc(uarb num, int in_digits, png_int_32 add)
    209    /* This is a signed 32-bit add, except that to avoid overflow the value added
    210     * or subtracted must be no more than 2^31-65536.  A negative result
    211     * indicates a negative number (which is an error below).  The size of
    212     * 'num' should be max(in_digits+1,2) for arbitrary 'add' but can be just
    213     * in_digits+1 if add is known to be in the range -65535..65535.
    214     */
    215 {
    216    FIX_GCC int out_digits = 0;
    217 
    218    while (out_digits < in_digits)
    219    {
    220       add += num[out_digits];
    221       num[out_digits++] = (png_uint_16)(add & 0xffff);
    222       add >>= 16;
    223    }
    224 
    225    while (add != 0 && add != (-1))
    226    {
    227       num[out_digits++] = (png_uint_16)(add & 0xffff);
    228       add >>= 16;
    229    }
    230 
    231    if (add == 0)
    232    {
    233       while (out_digits > 0 && num[out_digits-1] == 0)
    234          --out_digits;
    235       return out_digits; /* may be 0 */
    236    }
    237 
    238    else /* negative result */
    239    {
    240       while (out_digits > 1 && num[out_digits-1] == 0xffff)
    241          --out_digits;
    242 
    243       return -out_digits;
    244    }
    245 }
    246 
    247 static int
    248 uarb_add32(uarb num, int in_digits, png_uint_32 add)
    249    /* As above but this works with any 32-bit value and only does 'add' */
    250 {
    251    if (in_digits > 0)
    252    {
    253       in_digits = uarb_inc(num, in_digits, add & 0xffff);
    254       return uarb_inc(num+1, in_digits-1, add >> 16)+1;
    255    }
    256 
    257    return uarb_set(num, add);
    258 }
    259 
    260 static int
    261 uarb_mult_digit(uarb acc, int a_digits, uarb num, FIX_GCC int n_digits,
    262    png_uint_16 val)
    263    /* Primitive one-digit multiply - 'val' must be 0..65535. Note that this
    264     * primitive is a multiply and accumulate - the result of *num * val is added
    265     * to *acc.
    266     *
    267     * This is a one-digit multiply, so the product may be up to one digit longer
    268     * than 'num', however the add to 'acc' means that the caller must ensure
    269     * that 'acc' is at least one digit longer than this *and* at least one digit
    270     * longer than the current length of 'acc'.  (Or the caller must otherwise
    271     * ensure 'adigits' is adequate from knowledge of the values.)
    272     */
    273 {
    274    /* The digits in *acc, *num and val are in the range 0..65535, so the
    275     * result below is at most (65535*65535)+2*65635 = 65535*(65535+2), which is
    276     * exactly 0xffffffff.
    277     */
    278    if (val > 0 && n_digits > 0) /* Else the product is 0 */
    279    {
    280       png_uint_32 carry = 0;
    281       int out_digits = 0;
    282 
    283       while (out_digits < n_digits || carry > 0)
    284       {
    285          if (out_digits < a_digits)
    286             carry += acc[out_digits];
    287 
    288          if (out_digits < n_digits)
    289             carry += (png_uint_32)num[out_digits] * val;
    290 
    291          acc[out_digits++] = (png_uint_16)(carry & 0xffff);
    292          carry >>= 16;
    293       }
    294 
    295       /* So carry is 0 and all the input digits have been consumed. This means
    296        * that it is possible to skip any remaining digits in acc.
    297        */
    298       if (out_digits > a_digits)
    299          return out_digits;
    300    }
    301 
    302    return a_digits;
    303 }
    304 
    305 static int
    306 uarb_mult32(uarb acc, int a_digits, uarb num, int n_digits, png_uint_32 val)
    307    /* calculate acc += num * val, 'val' may be any 32-bit value, 'acc' and 'num'
    308     * may be any value, returns the number of digits in 'acc'.
    309     */
    310 {
    311    if (n_digits > 0 && val > 0)
    312    {
    313       a_digits = uarb_mult_digit(acc, a_digits, num, n_digits,
    314          (png_uint_16)(val & 0xffff));
    315 
    316       /* Because n_digits and val are >0 the following must be true: */
    317       assert(a_digits > 0);
    318 
    319       val >>= 16;
    320       if (val > 0)
    321          a_digits = uarb_mult_digit(acc+1, a_digits-1, num, n_digits,
    322             (png_uint_16)val) + 1;
    323    }
    324 
    325    return a_digits;
    326 }
    327 
    328 static int
    329 uarb_shift(uarb inout, int ndigits, unsigned int right_shift)
    330    /* Shift inout right by right_shift bits, right_shift must be in the range
    331     * 1..15
    332     */
    333 {
    334    FIX_GCC int i = ndigits;
    335    png_uint_16 carry = 0;
    336 
    337    assert(right_shift >= 1 && right_shift <= 15);
    338 
    339    while (--i >= 0)
    340    {
    341       png_uint_16 temp = (png_uint_16)(carry | (inout[i] >> right_shift));
    342 
    343       /* Bottom bits to top bits of carry */
    344       carry = (png_uint_16)((inout[i] << (16-right_shift)) & 0xffff);
    345 
    346       inout[i] = temp;
    347 
    348       /* The shift may reduce ndigits */
    349       if (i == ndigits-1 && temp == 0)
    350          ndigits = i;
    351    }
    352 
    353    return ndigits;
    354 }
    355 
    356 static int
    357 uarb_cmp(uarb a, int adigits, uarb b, int bdigits)
    358    /* Return -1/0/+1 according as a<b/a==b/a>b */
    359 {
    360    if (adigits < bdigits)
    361       return -1;
    362 
    363    if (adigits > bdigits)
    364       return 1;
    365 
    366    while (adigits-- > 0)
    367       if (a[adigits] < b[adigits])
    368          return -1;
    369 
    370       else if (a[adigits] > b[adigits])
    371          return 1;
    372 
    373    return 0;
    374 }
    375 
    376 #if 0 /*UNUSED*/
    377 static int
    378 uarb_eq32(uarb num, int digits, png_uint_32 val)
    379    /* Return true if the uarb is equal to 'val' */
    380 {
    381    switch (digits)
    382    {
    383       case 0:  return val == 0;
    384       case 1:  return val == num[0];
    385       case 2:  return (val & 0xffff) == num[0] && (val >> 16) == num[1];
    386       default: return 0;
    387    }
    388 }
    389 #endif
    390 
    391 static void
    392 uarb_printx(uarb num, int digits, FILE *out)
    393    /* Print 'num' as a hexadecimal number (easier than decimal!) */
    394 {
    395    while (digits > 0)
    396       if (num[--digits] > 0)
    397       {
    398          fprintf(out, "0x%x", num[digits]);
    399 
    400          while (digits > 0)
    401             fprintf(out, "%.4x", num[--digits]);
    402       }
    403 
    404       else if (digits == 0) /* the number is 0 */
    405          fputs("0x0", out);
    406 }
    407 
    408 static void
    409 uarb_print(uarb num, int digits, FILE *out)
    410    /* Prints 'num' as a decimal if it will fit in an unsigned long, else as a
    411     * hexadecimal number.  Notice that the results vary for images over 4GByte
    412     * in a system dependent way, and the hexadecimal form doesn't work very well
    413     * in awk script input.
    414     *
    415     *
    416     * TODO: write uarb_div10
    417     */
    418 {
    419    if (digits * sizeof (udigit) > sizeof (unsigned long))
    420       uarb_printx(num, digits, out);
    421 
    422    else
    423    {
    424       unsigned long n = 0;
    425 
    426       while (digits > 0)
    427          n = (n << 16) + num[--digits];
    428 
    429       fprintf(out, "%lu", n);
    430    }
    431 }
    432 
    433 /* Generate random bytes.  This uses a boring repeatable algorithm and it
    434  * is implemented here so that it gives the same set of numbers on every
    435  * architecture.  It's a linear congruential generator (Knuth or Sedgewick
    436  * "Algorithms") but it comes from the 'feedback taps' table in Horowitz and
    437  * Hill, "The Art of Electronics" (Pseudo-Random Bit Sequences and Noise
    438  * Generation.)
    439  *
    440  * (Copied from contrib/libtests/pngvalid.c)
    441  */
    442 static void
    443 make_random_bytes(png_uint_32* seed, void* pv, size_t size)
    444 {
    445    png_uint_32 u0 = seed[0], u1 = seed[1];
    446    png_bytep bytes = png_voidcast(png_bytep, pv);
    447 
    448    /* There are thirty-three bits; the next bit in the sequence is bit-33 XOR
    449     * bit-20.  The top 1 bit is in u1, the bottom 32 are in u0.
    450     */
    451    size_t i;
    452    for (i=0; i<size; ++i)
    453    {
    454       /* First generate 8 new bits then shift them in at the end. */
    455       png_uint_32 u = ((u0 >> (20-8)) ^ ((u1 << 7) | (u0 >> (32-7)))) & 0xff;
    456       u1 <<= 8;
    457       u1 |= u0 >> 24;
    458       u0 <<= 8;
    459       u0 |= u;
    460       *bytes++ = (png_byte)u;
    461    }
    462 
    463    seed[0] = u0;
    464    seed[1] = u1;
    465 }
    466 
    467 /* Clear an object to a random value. */
    468 static void
    469 clear(void *pv, size_t size)
    470 {
    471    static png_uint_32 clear_seed[2] = { 0x12345678, 0x9abcdef0 };
    472    make_random_bytes(clear_seed, pv, size);
    473 }
    474 
    475 #define CLEAR(object) clear(&(object), sizeof (object))
    476 
    477 /* Copied from unreleased 1.7 code.
    478  *
    479  * CRC checking uses a local pre-built implementation of the Ethernet CRC32.
    480  * This is to avoid a function call to the zlib DLL and to optimize the
    481  * byte-by-byte case.
    482  */
    483 static png_uint_32 crc_table[256] =
    484 {
    485    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
    486    0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
    487    0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
    488    0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
    489    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
    490    0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
    491    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
    492    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
    493    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
    494    0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
    495    0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
    496    0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
    497    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
    498    0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
    499    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
    500    0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
    501    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
    502    0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
    503    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
    504    0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
    505    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
    506    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
    507    0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
    508    0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
    509    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
    510    0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
    511    0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
    512    0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
    513    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
    514    0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
    515    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
    516    0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
    517    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
    518    0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
    519    0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
    520    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
    521    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
    522    0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
    523    0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
    524    0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
    525    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
    526    0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
    527    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
    528    0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
    529    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
    530    0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
    531    0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
    532    0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
    533    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
    534    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
    535    0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
    536    0x2d02ef8d
    537 };
    538 
    539 /* The CRC calculated here *IS* conditioned, the corresponding value used by
    540  * zlib and the result value is obtained by XORing with CRC_INIT, which is also
    541  * the first value that must be passed in (for the first byte) to crc_one_byte.
    542  */
    543 #define CRC_INIT 0xffffffff
    544 
    545 static png_uint_32
    546 crc_one_byte(png_uint_32 crc, int b)
    547 {
    548    return crc_table[(crc ^ b) & 0xff] ^ (crc >> 8);
    549 }
    550 
    551 static png_uint_32
    552 crc_init_4(png_uint_32 value)
    553 {
    554    /* This is an alternative to the algorithm used in zlib, which requires four
    555     * separate tables to parallelize the four byte operations, it only works for
    556     * a CRC of the first four bytes of the stream, but this is what happens in
    557     * the parser below where length+chunk-name is read and chunk-name used to
    558     * initialize the CRC.  Notice that the calculation here avoids repeated
    559     * conditioning (xor with 0xffffffff) by storing the conditioned value.
    560     */
    561    png_uint_32 crc = crc_table[(~value >> 24)] ^ 0xffffff;
    562 
    563    crc = crc_table[(crc ^ (value >> 16)) & 0xff] ^ (crc >> 8);
    564    crc = crc_table[(crc ^ (value >> 8)) & 0xff] ^ (crc >> 8);
    565    return crc_table[(crc ^ value) & 0xff] ^ (crc >> 8);
    566 }
    567 
    568 static int
    569 chunk_type_valid(png_uint_32 c)
    570    /* Bit whacking approach to chunk name validation that is intended to avoid
    571     * branches.  The cost is that it uses a lot of 32-bit constants, which might
    572     * be bad on some architectures.
    573     */
    574 {
    575    png_uint_32 t;
    576 
    577    /* Remove bit 5 from all but the reserved byte; this means every
    578     * 8-bit unit must be in the range 65-90 to be valid.  So bit 5
    579     * must be zero, bit 6 must be set and bit 7 zero.
    580     */
    581    c &= ~PNG_U32(32,32,0,32);
    582    t = (c & ~0x1f1f1f1f) ^ 0x40404040;
    583 
    584    /* Subtract 65 for each 8 bit quantity, this must not overflow
    585     * and each byte must then be in the range 0-25.
    586     */
    587    c -= PNG_U32(65,65,65,65);
    588    t |=c ;
    589 
    590    /* Subtract 26, handling the overflow which should set the top
    591     * three bits of each byte.
    592     */
    593    c -= PNG_U32(25,25,25,26);
    594    t |= ~c;
    595 
    596    return (t & 0xe0e0e0e0) == 0;
    597 }
    598 
    599 /**************************** CONTROL INFORMATION *****************************/
    600 
    601 /* Information about a sequence of IDAT chunks, the chunks have been re-synced
    602  * using sync_stream below and the new lengths are recorded here.  Because the
    603  * number of chunks is unlimited this is handled using a linked list of these
    604  * structures.
    605  */
    606 struct IDAT_list
    607 {
    608    struct IDAT_list *next;     /* Linked list */
    609    unsigned int      length;   /* Actual length of the array below */
    610    unsigned int      count;    /* Number of entries that are valid */
    611 #     define IDAT_INIT_LENGTH 16
    612    png_uint_32       lengths[IDAT_INIT_LENGTH];
    613 };
    614 
    615 static void
    616 IDAT_list_init(struct IDAT_list *list)
    617 {
    618    CLEAR(*list);
    619 
    620    list->next = NULL;
    621    list->length = IDAT_INIT_LENGTH;
    622 }
    623 
    624 static size_t
    625 IDAT_list_size(struct IDAT_list *list, unsigned int length)
    626    /* Return the size in bytes of an IDAT_list of the given length. */
    627 {
    628    if (list != NULL)
    629       length = list->length;
    630 
    631    return sizeof *list - sizeof list->lengths +
    632       length * sizeof list->lengths[0];
    633 }
    634 
    635 static void
    636 IDAT_list_end(struct IDAT_list *IDAT_list)
    637 {
    638    struct IDAT_list *list = IDAT_list->next;
    639 
    640    CLEAR(*IDAT_list);
    641 
    642    while (list != NULL)
    643    {
    644       struct IDAT_list *next = list->next;
    645 
    646       clear(list, IDAT_list_size(list, 0));
    647       free(list);
    648       list = next;
    649    }
    650 }
    651 
    652 static struct IDAT_list *
    653 IDAT_list_extend(struct IDAT_list *tail)
    654 {
    655    /* Use the previous cached value if available. */
    656    struct IDAT_list *next = tail->next;
    657 
    658    if (next == NULL)
    659    {
    660       /* Insert a new, malloc'ed, block of IDAT information buffers, this
    661        * one twice as large as the previous one:
    662        */
    663       unsigned int length = 2 * tail->length;
    664 
    665       if (length < tail->length) /* arithmetic overflow */
    666          length = tail->length;
    667 
    668       next = png_voidcast(IDAT_list*, malloc(IDAT_list_size(NULL, length)));
    669       CLEAR(*next);
    670 
    671       /* The caller must handle this: */
    672       if (next == NULL)
    673          return NULL;
    674 
    675       next->next = NULL;
    676       next->length = length;
    677       tail->next = next;
    678    }
    679 
    680    return next;
    681 }
    682 
    683 /* GLOBAL CONTROL STRUCTURE */
    684 struct global
    685 {
    686    /* PUBLIC GLOBAL VARIABLES: OWNER INITIALIZE */
    687    unsigned int   errors        :1; /* print file errors to stderr */
    688    unsigned int   warnings      :1; /* print libpng warnings to stderr */
    689    unsigned int   optimize_zlib :1; /* Run optimization search */
    690    unsigned int   quiet         :2; /* don't output summaries */
    691    unsigned int   verbose       :3; /* various internal tracking */
    692    unsigned int   skip          :3; /* Non-critical chunks to skip */
    693 #     define SKIP_NONE      0
    694 #     define SKIP_BAD_CRC   1    /* Chunks with a bad CRC */
    695 #     define SKIP_UNSAFE    2    /* Chunks not safe to copy */
    696 #     define SKIP_UNUSED    3    /* Chunks not used by libpng */
    697 #     define SKIP_TRANSFORM 4    /* Chunks only used in transforms */
    698 #     define SKIP_COLOR     5    /* Everything but tRNS, sBIT, gAMA and sRGB */
    699 #     define SKIP_ALL       6    /* Everything but tRNS and sBIT */
    700 
    701    png_uint_32    idat_max;         /* 0 to perform no re-chunking */
    702 
    703    int            status_code;      /* Accumulated status code */
    704 #     define TOO_FAR_BACK   0x01 /* found a too-far-back error */
    705 #     define CRC_ERROR      0x02 /* fixed an invalid CRC */
    706 #     define STREAM_ERROR   0x04 /* damaged PNG stream (may be fixable) */
    707 #     define TRUNCATED      0x08 /* truncated but still readable */
    708 #     define FILE_ERROR     0x10 /* could not read the file */
    709 #     define WRITE_ERROR    0x20 /* write error (this terminates the read) */
    710 #     define INTERNAL_ERROR 0x40 /* internal limits/errors encountered */
    711 
    712    /* PUBLIC GLOBAL VARIABLES: USED INTERNALLY BY IDAT READ CODE */
    713    struct IDAT_list idat_cache;  /* Cache of file IDAT information buffers */
    714       /* The structure is shared across all uses of this global control
    715        * structure to avoid reallocation between IDAT streams.
    716        */
    717 };
    718 
    719 static int
    720 global_end(struct global *global)
    721 {
    722 
    723    int rc;
    724 
    725    IDAT_list_end(&global->idat_cache);
    726    rc = global->status_code;
    727    CLEAR(*global);
    728    return rc;
    729 }
    730 
    731 static void
    732 global_init(struct global *global)
    733    /* Call this once (and only once) to initialize the control */
    734 {
    735    CLEAR(*global);
    736 
    737    /* Globals */
    738    global->errors        = 0;
    739    global->warnings      = 0;
    740    global->quiet         = 0;
    741    global->verbose       = 0;
    742    global->idat_max      = 0;         /* no re-chunking of IDAT */
    743    global->optimize_zlib = 0;
    744    global->skip          = SKIP_NONE;
    745    global->status_code   = 0;
    746 
    747    IDAT_list_init(&global->idat_cache);
    748 }
    749 
    750 static int
    751 skip_chunk_type(const struct global *global, png_uint_32 type)
    752    /* Return true if this chunk is to be skipped according to the --strip
    753     * option.  This code needs to recognize all known ancillary chunks in order
    754     * to handle the --strip=unsafe option.
    755     */
    756 {
    757    /* Never strip critical chunks: */
    758    if (CRITICAL(type))
    759       return 0;
    760 
    761    switch (type)
    762    {
    763       /* Chunks that are treated as, effectively, critical because they affect
    764        * correct interpretation of the pixel values:
    765        */
    766       case png_tRNS: case png_sBIT:
    767          return 0;
    768 
    769       /* Chunks that specify gamma encoding which should therefore only be
    770        * removed the the user insists:
    771        */
    772       case png_gAMA: case png_sRGB:
    773          if (global->skip >= SKIP_ALL)
    774             return 1;
    775          return 0;
    776 
    777       /* Chunks that affect color interpretation - not used by libpng and rarely
    778        * used by applications, but technically still required for correct
    779        * interpretation of the image data:
    780        */
    781       case png_cHRM: case png_iCCP:
    782          if (global->skip >= SKIP_COLOR)
    783             return 1;
    784          return 0;
    785 
    786       /* Other chunks that are used by libpng in image transformations (as
    787        * opposed to known chunks that have get/set APIs but are not otherwise
    788        * used.)
    789        */
    790       case png_bKGD:
    791          if (global->skip >= SKIP_TRANSFORM)
    792             return 1;
    793          return 0;
    794 
    795       /* All other chunks that libpng knows about and affect neither image
    796        * interpretation nor libpng transforms - chunks that are effectively
    797        * unused by libpng even though libpng might recognize and store them.
    798        */
    799       case png_fRAc: case png_gIFg: case png_gIFt: case png_gIFx: case png_hIST:
    800       case png_iTXt: case png_oFFs: case png_pCAL: case png_pHYs: case png_sCAL:
    801       case png_sPLT: case png_sTER: case png_tEXt: case png_tIME: case png_zTXt:
    802          if (global->skip >= SKIP_UNUSED)
    803             return 1;
    804          return 0;
    805 
    806       /* Chunks that libpng does not know about (notice that this depends on the
    807        * list above including all known chunks!)  The decision here depends on
    808        * whether the safe-to-copy bit is set in the chunk type.
    809        */
    810       default:
    811          if (SAFE_TO_COPY(type))
    812          {
    813             if (global->skip >= SKIP_UNUSED) /* as above */
    814                return 1;
    815          }
    816 
    817          else if (global->skip >= SKIP_UNSAFE)
    818             return 1;
    819 
    820          return 0;
    821    }
    822 }
    823 
    824 /* PER-FILE CONTROL STRUCTURE */
    825 struct chunk;
    826 struct IDAT;
    827 struct file
    828 {
    829    /* ANCESTORS */
    830    struct global *global;
    831 
    832    /* PUBLIC PER-FILE VARIABLES: CALLER INITIALIZE */
    833    const char *   file_name;
    834    const char *   out_name;      /* Name of output file (if required) */
    835 
    836    /* PUBLIC PER-FILE VARIABLES: SET BY PNG READ CODE */
    837    /* File specific result codes */
    838    int            status_code;   /* Set to a bit mask of the following: */
    839    int            read_errno;    /* Records a read error errno */
    840    int            write_errno;   /* Records a write error errno */
    841 
    842    /* IHDR information */
    843    png_uint_32    width;
    844    png_uint_32    height;
    845    png_byte       bit_depth;
    846    png_byte       color_type;
    847    png_byte       compression_method;
    848    png_byte       filter_method;
    849    png_byte       interlace_method;
    850 
    851    udigit         image_bytes[5];
    852    int            image_digits;
    853 
    854    /* PROTECTED PER-FILE VARIABLES: USED BY THE READ CODE */
    855    FILE *         file;          /* Original PNG file */
    856    FILE *         out;           /* If a new one is being written */
    857    jmp_buf        jmpbuf;        /* Set while reading a PNG */
    858 
    859    /* PROTECTED CHUNK SPECIFIC VARIABLES: USED BY CHUNK CODE */
    860    /* The following variables are used during reading to record the length, type
    861     * and data position of the *next* chunk or, right at the start, the
    862     * signature (in length,type).
    863     *
    864     * When a chunk control structure is instantiated these values are copied
    865     * into the structure and can then be overritten with the data for the next
    866     * chunk.
    867     */
    868    fpos_t         data_pos;      /* Position of first byte of chunk data */
    869    png_uint_32    length;        /* First word (length or signature start) */
    870    png_uint_32    type;          /* Second word (type or signature end) */
    871    png_uint_32    crc;           /* Running chunk CRC (used by read_chunk) */
    872 
    873    /* These counts are maintained by the read and write routines below and are
    874     * reset by the chunk handling code.  They record the total number of bytes
    875     * read or written for the chunk, including the header (length,type) bytes.
    876     */
    877    png_uint_32    read_count;    /* Count of bytes read (in the chunk) */
    878    png_uint_32    write_count;   /* Count of bytes written (in the chunk) */
    879    int            state;         /* As defined here: */
    880 #     define STATE_SIGNATURE  0  /* The signature is being written */
    881 #     define STATE_CHUNKS     1  /* Non-IDAT chunks are being written */
    882 #     define STATE_IDAT       2  /* An IDAT stream is being written */
    883 
    884    /* Two pointers used to enable clean-up in the event of fatal errors and to
    885     * hold state about the parser process (only one of each at present.)
    886     */
    887    struct chunk * chunk;
    888    struct IDAT *  idat;
    889 
    890    /* Interface to allocate a new chunk or IDAT control structure.  The result
    891     * is returned by setting one or other of the above variables.  Note that the
    892     * relevant initializer is called by the allocator function.  The alloc_ptr
    893     * is used only by the implementation of the allocate function.
    894     */
    895    void *         alloc_ptr;
    896    void         (*alloc)(struct file*,int idat);
    897                                   /* idat: allocate IDAT not chunk */
    898 };
    899 
    900 /* Valid longjmp (stop) codes are: */
    901 #define LIBPNG_WARNING_CODE   1 /* generic png_error */
    902 #define LIBPNG_ERROR_CODE     2 /* generic png_error */
    903 #define ZLIB_ERROR_CODE       3 /* generic zlib error */
    904 #define INVALID_ERROR_CODE    4 /* detected an invalid PNG */
    905 #define READ_ERROR_CODE       5 /* read failed */
    906 #define WRITE_ERROR_CODE      6 /* error in write */
    907 #define UNEXPECTED_ERROR_CODE 7 /* unexpected (internal?) error */
    908 
    909 static void
    910 emit_string(const char *str, FILE *out)
    911    /* Print a string with spaces replaced by '_' and non-printing characters by
    912     * an octal escape.
    913     */
    914 {
    915    for (; *str; ++str)
    916       if (isgraph(UCHAR_MAX & *str))
    917          putc(*str, out);
    918 
    919       else if (isspace(UCHAR_MAX & *str))
    920          putc('_', out);
    921 
    922       else
    923          fprintf(out, "\\%.3o", *str);
    924 }
    925 
    926 static const char *
    927 strcode(int code)
    928 {
    929    switch (code)
    930    {
    931       case LIBPNG_WARNING_CODE:   return "warning";
    932       case LIBPNG_ERROR_CODE:     return "libpng";
    933       case ZLIB_ERROR_CODE:       return "zlib";
    934       case INVALID_ERROR_CODE:    return "invalid";
    935       case READ_ERROR_CODE:       return "read";
    936       case WRITE_ERROR_CODE:      return "write";
    937       case UNEXPECTED_ERROR_CODE: return "unexpected";
    938       default:                    return "INVALID";
    939    }
    940 }
    941 
    942 static void
    943 emit_error(struct file *file, int code, const char *what)
    944    /* Generic error message routine, takes a 'stop' code but can be used
    945     * elsewhere.  Always outputs a message.
    946     */
    947 {
    948    const char *reason;
    949    int err = 0;
    950 
    951    switch (code)
    952    {
    953       case LIBPNG_WARNING_CODE:   reason = "libpng warning:"; break;
    954       case LIBPNG_ERROR_CODE:     reason = "libpng error:"; break;
    955       case ZLIB_ERROR_CODE:       reason = "zlib error:"; break;
    956       case INVALID_ERROR_CODE:    reason = "invalid"; break;
    957       case READ_ERROR_CODE:       reason = "read failure:";
    958                                   err = file->read_errno;
    959                                   break;
    960       case WRITE_ERROR_CODE:      reason = "write error";
    961                                   err = file->write_errno;
    962                                   break;
    963       case UNEXPECTED_ERROR_CODE: reason = "unexpected error:";
    964                                   err = file->read_errno;
    965                                   if (err == 0)
    966                                      err = file->write_errno;
    967                                   break;
    968       default:                    reason = "INVALID (internal error):"; break;
    969    }
    970 
    971    if (err != 0)
    972       fprintf(stderr, "%s: %s %s [%s]\n", file->file_name, reason, what,
    973          strerror(err));
    974 
    975    else
    976       fprintf(stderr, "%s: %s %s\n", file->file_name, reason, what);
    977 }
    978 
    979 static void chunk_end(struct chunk **);
    980 static void IDAT_end(struct IDAT **);
    981 
    982 static int
    983 file_end(struct file *file)
    984 {
    985    int rc;
    986 
    987    /* If either of the chunk pointers are set end them here, the IDAT structure
    988     * must be deallocated first as it may deallocate the chunk structure.
    989     */
    990    if (file->idat != NULL)
    991       IDAT_end(&file->idat);
    992 
    993    if (file->chunk != NULL)
    994       chunk_end(&file->chunk);
    995 
    996    rc = file->status_code;
    997 
    998    if (file->file != NULL)
    999       (void)fclose(file->file);
   1000 
   1001    if (file->out != NULL)
   1002    {
   1003       /* NOTE: this is bitwise |, all the following functions must execute and
   1004        * must succeed.
   1005        */
   1006       if (ferror(file->out) | fflush(file->out) | fclose(file->out))
   1007       {
   1008          perror(file->out_name);
   1009          emit_error(file, READ_ERROR_CODE, "output write error");
   1010          rc |= WRITE_ERROR;
   1011       }
   1012    }
   1013 
   1014    /* Accumulate the result codes */
   1015    file->global->status_code |= rc;
   1016 
   1017    CLEAR(*file);
   1018 
   1019    return rc; /* status code: non-zero on read or write error */
   1020 }
   1021 
   1022 static int
   1023 file_init(struct file *file, struct global *global, const char *file_name,
   1024    const char *out_name, void *alloc_ptr, void (*alloc)(struct file*,int))
   1025    /* Initialize a file control structure.  This will open the given files as
   1026     * well.  The status code returned is 0 on success, non zero (using the flags
   1027     * above) on a file open error.
   1028     */
   1029 {
   1030    CLEAR(*file);
   1031    file->global = global;
   1032 
   1033    file->file_name = file_name;
   1034    file->out_name = out_name;
   1035    file->status_code = 0;
   1036    file->read_errno = 0;
   1037    file->write_errno = 0;
   1038 
   1039    file->file = NULL;
   1040    file->out = NULL;
   1041    /* jmpbuf is garbage: must be set by read_png */
   1042 
   1043    file->read_count = 0;
   1044    file->state = STATE_SIGNATURE;
   1045 
   1046    file->chunk = NULL;
   1047    file->idat = NULL;
   1048 
   1049    file->alloc_ptr = alloc_ptr;
   1050    file->alloc = alloc;
   1051 
   1052    /* Open the files: */
   1053    assert(file_name != NULL);
   1054    file->file = fopen(file_name, "rb");
   1055 
   1056    if (file->file == NULL)
   1057    {
   1058       file->read_errno = errno;
   1059       file->status_code |= FILE_ERROR;
   1060       /* Always output: please give a readable file! */
   1061       perror(file_name);
   1062       return FILE_ERROR;
   1063    }
   1064 
   1065    if (out_name != NULL)
   1066    {
   1067       file->out = fopen(out_name, "wb");
   1068 
   1069       if (file->out == NULL)
   1070       {
   1071          file->write_errno = errno;
   1072          file->status_code |= WRITE_ERROR;
   1073          perror(out_name);
   1074          return WRITE_ERROR;
   1075       }
   1076    }
   1077 
   1078    return 0;
   1079 }
   1080 
   1081 static void
   1082 log_error(struct file *file, int code, const char *what)
   1083    /* Like emit_error but checks the global 'errors' flag */
   1084 {
   1085    if (file->global->errors)
   1086       emit_error(file, code, what);
   1087 }
   1088 
   1089 static char
   1090 type_char(png_uint_32 v)
   1091 {
   1092    /* In fact because chunk::chunk_type is validated prior to any call to this
   1093     * function it will always return a-zA-Z, but the extra codes are just there
   1094     * to help in finding internal (programming) errors.  Note that the code only
   1095     * ever considers the low 7 bits of the value (so it is not necessary for the
   1096     * type_name function to mask of the byte.)
   1097     */
   1098    if (v & 32)
   1099       return "!abcdefghijklmnopqrstuvwxyz56789"[(v-96)&31];
   1100 
   1101    else
   1102       return "@ABCDEFGHIJKLMNOPQRSTUVWXYZ01234"[(v-64)&31];
   1103 }
   1104 
   1105 static void
   1106 type_name(png_uint_32 type, FILE *out)
   1107 {
   1108    putc(type_char(type >> 24), out);
   1109    putc(type_char(type >> 16), out);
   1110    putc(type_char(type >>  8), out);
   1111    putc(type_char(type      ), out);
   1112 }
   1113 
   1114 static void
   1115 type_sep(FILE *out)
   1116 {
   1117    putc(':', out);
   1118    putc(' ', out);
   1119 }
   1120 
   1121 static png_uint_32 current_type(struct file *file, int code);
   1122 
   1123 PNG_NORETURN static void
   1124 stop(struct file *file, int code, const char *what)
   1125    /* Return control when a PNG file cannot be read. This outputs an 'ERR'
   1126     * summary line too.
   1127     */
   1128 {
   1129    log_error(file, code, what);
   1130 
   1131    /* The chunk being read is typically identified by file->chunk or, if this is
   1132     * NULL, by file->type.  This may be wrong if libpng reads ahead, but this
   1133     * only happens with IDAT where libpng reads the header then jumps around
   1134     * finding errors in the previous chunks.  We know that is happening because
   1135     * we are at the start of the IDAT (i.e. no IDAT data has yet been written.)
   1136     *
   1137     * SUMMARY FORMAT (stop):
   1138     *
   1139     * IDAT ERR status code read-errno write-errno message file
   1140     *
   1141     * 'uncompressed' will be 0 if there was a problem in the IHDR.  The errno
   1142     * values are emit_string(strerror(errno)).
   1143     */
   1144    if (file->global->quiet < 2) /* need two quiets to stop this. */
   1145    {
   1146       png_uint_32 type;
   1147 
   1148       if (file->chunk != NULL)
   1149          type = current_type(file, code); /* Gropes in struct chunk and IDAT */
   1150 
   1151       else
   1152          type = file->type;
   1153 
   1154       if (type)
   1155          type_name(type, stdout);
   1156 
   1157       else /* magic: an IDAT header, produces bogons for too many IDATs */
   1158          fputs("HEAD", stdout); /* not a registered chunk! */
   1159 
   1160       printf(" ERR %.2x %s ", file->status_code, strcode(code));
   1161       /* This only works one strerror at a time, because of the way strerror is
   1162        * implemented.
   1163        */
   1164       emit_string(strerror(file->read_errno), stdout);
   1165       putc(' ', stdout);
   1166       emit_string(strerror(file->write_errno), stdout);
   1167       putc(' ', stdout);
   1168       emit_string(what, stdout);
   1169       putc(' ', stdout);
   1170       fputs(file->file_name, stdout);
   1171       putc('\n', stdout);
   1172    }
   1173 
   1174    file->status_code |= FILE_ERROR;
   1175    longjmp(file->jmpbuf, code);
   1176 }
   1177 
   1178 PNG_NORETURN static void
   1179 stop_invalid(struct file *file, const char *what)
   1180 {
   1181    stop(file, INVALID_ERROR_CODE, what);
   1182 }
   1183 
   1184 static void
   1185 type_message(struct file *file, png_uint_32 type, const char *what)
   1186    /* Error message for a chunk; the chunk name comes from 'type' */
   1187 {
   1188    if (file->global->errors)
   1189    {
   1190       fputs(file->file_name, stderr);
   1191       type_sep(stderr);
   1192       type_name(type, stderr);
   1193       type_sep(stderr);
   1194       fputs(what, stderr);
   1195       putc('\n', stderr);
   1196    }
   1197 }
   1198 
   1199 /* Input file positioning - we jump around in the input file while reading
   1200  * stuff, these wrappers deal with the error handling.
   1201  */
   1202 static void
   1203 file_getpos(struct file *file, fpos_t *pos)
   1204 {
   1205    if (fgetpos(file->file, pos))
   1206    {
   1207       /* This is unexpected, so perror it */
   1208       perror(file->file_name);
   1209       stop(file, READ_ERROR_CODE, "fgetpos");
   1210    }
   1211 }
   1212 
   1213 static void
   1214 file_setpos(struct file *file, const fpos_t *pos)
   1215 {
   1216    if (fsetpos(file->file, pos))
   1217    {
   1218       perror(file->file_name);
   1219       stop(file, READ_ERROR_CODE, "fsetpos");
   1220    }
   1221 }
   1222 
   1223 static void
   1224 getpos(struct file *file)
   1225    /* Get the current position and store it in 'data_pos'.  The corresponding
   1226     * setpos() function is chunk specific because it uses the copy of the
   1227     * position for the specific chunk.
   1228     */
   1229 {
   1230    file_getpos(file, &file->data_pos);
   1231 }
   1232 
   1233 
   1234 /* Read utility - read a single byte, returns a value in the range 0..255 or EOF
   1235  * on a read error.  In the latter case status_code and read_errno are updated
   1236  * appropriately.
   1237  */
   1238 static int
   1239 read_byte(struct file *file)
   1240 {
   1241    int ch = getc(file->file);
   1242 
   1243    if (ch >= 0 && ch <= 255)
   1244    {
   1245       ++(file->read_count);
   1246       return ch;
   1247    }
   1248 
   1249    else if (ch != EOF)
   1250    {
   1251       file->status_code |= INTERNAL_ERROR;
   1252       file->read_errno = ERANGE; /* out of range character */
   1253 
   1254       /* This is very unexpected; an error message is always output: */
   1255       emit_error(file, UNEXPECTED_ERROR_CODE, "file read");
   1256    }
   1257 
   1258 #  ifdef EINTR
   1259       else if (errno == EINTR) /* Interrupted, try again */
   1260       {
   1261          errno = 0;
   1262          return read_byte(file);
   1263       }
   1264 #  endif
   1265 
   1266    else
   1267    {
   1268       /* An error, it doesn't really matter what the error is but it gets
   1269        * recorded anyway.
   1270        */
   1271       if (ferror(file->file))
   1272          file->read_errno = errno;
   1273 
   1274       else if (feof(file->file))
   1275          file->read_errno = 0; /* I.e. a regular EOF, no error */
   1276 
   1277       else /* unexpected */
   1278          file->read_errno = EDOM;
   1279    }
   1280 
   1281    /* 'TRUNCATED' is used for all cases of failure to read a byte, because of
   1282     * the way libpng works a byte read is never attempted unless the byte is
   1283     * expected to be there, so EOF should not occur.
   1284     */
   1285    file->status_code |= TRUNCATED;
   1286    return EOF;
   1287 }
   1288 
   1289 static png_byte
   1290 reread_byte(struct file *file)
   1291    /* Read a byte when an error is not expected to happen because the byte has
   1292     * been read before without error.
   1293     */
   1294 {
   1295    int ch = getc(file->file);
   1296 
   1297    if (errno != 0)
   1298       file->read_errno = errno;
   1299 
   1300    if (ch < 0 || ch > 255)
   1301       stop(file, UNEXPECTED_ERROR_CODE, "reread");
   1302 
   1303    return (png_byte)ch;
   1304 }
   1305 
   1306 static png_uint_32
   1307 reread_4(struct file *file)
   1308    /* The same but for a four byte quantity */
   1309 {
   1310    png_uint_32 result = 0;
   1311    int i = 0;
   1312 
   1313    while (++i <= 4)
   1314       result = (result << 8) + reread_byte(file);
   1315 
   1316    return result;
   1317 }
   1318 
   1319 static void
   1320 skip_12(struct file *file)
   1321    /* Skip exactly 12 bytes in the input stream - used to skip a CRC and chunk
   1322     * header that has been read before.
   1323     */
   1324 {
   1325    /* Since the chunks were read before this shouldn't fail: */
   1326    if (fseek(file->file, 12, SEEK_CUR) != 0)
   1327    {
   1328       if (errno != 0)
   1329          file->read_errno = errno;
   1330 
   1331       stop(file, UNEXPECTED_ERROR_CODE, "reskip");
   1332    }
   1333 }
   1334 
   1335 static void
   1336 write_byte(struct file *file, int b)
   1337    /* Write one byte to the output - this causes a fatal error if the write
   1338     * fails and the read of this PNG file immediately terminates.  Just
   1339     * increments the write count if there is no output file.
   1340     */
   1341 {
   1342    if (file->out != NULL)
   1343    {
   1344       if (putc(b, file->out) != b)
   1345       {
   1346          file->write_errno = errno;
   1347          file->status_code |= WRITE_ERROR;
   1348          stop(file, WRITE_ERROR_CODE, "write byte");
   1349       }
   1350    }
   1351 
   1352    ++(file->write_count);
   1353 }
   1354 
   1355 /* Derivatives of the read/write functions. */
   1356 static unsigned int
   1357 read_4(struct file *file, png_uint_32 *pu)
   1358    /* Read four bytes, returns the number of bytes read successfully and, if all
   1359     * four bytes are read, assigns the result to *pu.
   1360     */
   1361 {
   1362    unsigned int i = 0;
   1363    png_uint_32 val = 0;
   1364 
   1365    do
   1366    {
   1367       int ch = read_byte(file);
   1368 
   1369       if (ch == EOF)
   1370          return i;
   1371 
   1372       val = (val << 8) + ch;
   1373    } while (++i < 4);
   1374 
   1375    *pu = val;
   1376    return i;
   1377 }
   1378 
   1379 /* CRC handling - read but calculate the CRC while doing so. */
   1380 static int
   1381 crc_read_many(struct file *file, png_uint_32 length)
   1382    /* Reads 'length' bytes and updates the CRC, returns true on success, false
   1383     * if the input is truncated.
   1384     */
   1385 {
   1386    if (length > 0)
   1387    {
   1388       png_uint_32 crc = file->crc;
   1389 
   1390       do
   1391       {
   1392          int ch = read_byte(file);
   1393 
   1394          if (ch == EOF)
   1395             return 0; /* Truncated */
   1396 
   1397          crc = crc_one_byte(crc, ch);
   1398       }
   1399       while (--length > 0);
   1400 
   1401       file->crc = crc;
   1402    }
   1403 
   1404    return 1; /* OK */
   1405 }
   1406 
   1407 static int
   1408 calc_image_size(struct file *file)
   1409    /* Fill in the image_bytes field given the IHDR information, calls stop on
   1410     * error.
   1411     */
   1412 {
   1413    png_uint_16 pd = file->bit_depth;
   1414 
   1415    switch (file->color_type)
   1416    {
   1417       default:
   1418          stop_invalid(file, "IHDR: colour type");
   1419 
   1420       invalid_bit_depth:
   1421          stop_invalid(file, "IHDR: bit depth");
   1422 
   1423       case 0: /* g */
   1424          if (pd != 1 && pd != 2 && pd != 4 && pd != 8 && pd != 16)
   1425             goto invalid_bit_depth;
   1426          break;
   1427 
   1428       case 3:
   1429          if (pd != 1 && pd != 2 && pd != 4 && pd != 8)
   1430             goto invalid_bit_depth;
   1431          break;
   1432 
   1433       case 2: /* rgb */
   1434          if (pd != 8 && pd != 16)
   1435             goto invalid_bit_depth;
   1436 
   1437          pd = (png_uint_16)(pd * 3);
   1438          break;
   1439 
   1440       case 4: /* ga */
   1441          if (pd != 8 && pd != 16)
   1442             goto invalid_bit_depth;
   1443 
   1444          pd = (png_uint_16)(pd * 2);
   1445          break;
   1446 
   1447       case 6: /* rgba */
   1448          if (pd != 8 && pd != 16)
   1449             goto invalid_bit_depth;
   1450 
   1451          pd = (png_uint_16)(pd * 4);
   1452          break;
   1453    }
   1454 
   1455    if (file->width < 1 || file->width > 0x7fffffff)
   1456       stop_invalid(file, "IHDR: width");
   1457 
   1458    else if (file->height < 1 || file->height > 0x7fffffff)
   1459       stop_invalid(file, "IHDR: height");
   1460 
   1461    else if (file->compression_method != 0)
   1462       stop_invalid(file, "IHDR: compression method");
   1463 
   1464    else if (file->filter_method != 0)
   1465       stop_invalid(file, "IHDR: filter method");
   1466 
   1467    else switch (file->interlace_method)
   1468    {
   1469       case PNG_INTERLACE_ADAM7:
   1470          /* Interlacing makes the image larger because of the replication of
   1471           * both the filter byte and the padding to a byte boundary.
   1472           */
   1473          {
   1474             int pass;
   1475             int image_digits = 0;
   1476             udigit row_width[2], row_bytes[3];
   1477 
   1478             for (pass=0; pass<=6; ++pass)
   1479             {
   1480                png_uint_32 pw = PNG_PASS_COLS(file->width, pass);
   1481 
   1482                if (pw > 0)
   1483                {
   1484                   int  digits;
   1485 
   1486                   /* calculate 1+((pw*pd+7)>>3) in row_bytes */
   1487                   digits = uarb_mult_digit(row_bytes, uarb_set(row_bytes, 7),
   1488                      row_width, uarb_set(row_width, pw), pd);
   1489                   digits = uarb_shift(row_bytes, digits, 3);
   1490                   digits = uarb_inc(row_bytes, digits, 1);
   1491 
   1492                   /* Add row_bytes * pass-height to the file image_bytes field
   1493                    */
   1494                   image_digits = uarb_mult32(file->image_bytes, image_digits,
   1495                      row_bytes, digits,
   1496                      PNG_PASS_ROWS(file->height, pass));
   1497                }
   1498             }
   1499 
   1500             file->image_digits = image_digits;
   1501          }
   1502          break;
   1503 
   1504       case PNG_INTERLACE_NONE:
   1505          {
   1506             int  digits;
   1507             udigit row_width[2], row_bytes[3];
   1508 
   1509             /* As above, but use image_width in place of the pass width: */
   1510             digits = uarb_mult_digit(row_bytes, uarb_set(row_bytes, 7),
   1511                row_width, uarb_set(row_width, file->width), pd);
   1512             digits = uarb_shift(row_bytes, digits, 3);
   1513             digits = uarb_inc(row_bytes, digits, 1);
   1514 
   1515             /* Set row_bytes * image-height to the file image_bytes field */
   1516             file->image_digits = uarb_mult32(file->image_bytes, 0,
   1517                row_bytes, digits, file->height);
   1518          }
   1519          break;
   1520 
   1521       default:
   1522          stop_invalid(file, "IHDR: interlace method");
   1523    }
   1524 
   1525    assert(file->image_digits >= 1 && file->image_digits <= 5);
   1526    return 1;
   1527 }
   1528 
   1529 /* PER-CHUNK CONTROL STRUCTURE
   1530  * This structure is instantiated for each chunk, except for the IDAT chunks
   1531  * where one chunk control structure is used for the whole of a single stream of
   1532  * IDAT chunks (see the IDAT control structure below).
   1533  */
   1534 struct chunk
   1535 {
   1536    /* ANCESTORS */
   1537    struct file *         file;
   1538    struct global *       global;
   1539 
   1540    /* PUBLIC IDAT INFORMATION: SET BY THE ZLIB CODE */
   1541    udigit         uncompressed_bytes[5];
   1542    int            uncompressed_digits;
   1543    udigit         compressed_bytes[5];
   1544    int            compressed_digits;
   1545 
   1546    /* PUBLIC PER-CHUNK INFORMATION: USED BY CHUNK READ CODE */
   1547    /* This information is filled in by chunk_init from the data in the file
   1548     * control structure, but chunk_length may be changed later.
   1549     */
   1550    fpos_t         chunk_data_pos;    /* Position of first byte of chunk data */
   1551    png_uint_32    chunk_length;      /* From header (or modified below) */
   1552    png_uint_32    chunk_type;        /* From header */
   1553 
   1554    /* PUBLIC PER-CHUNK INFORMATION: FOR THE CHUNK WRITE CODE */
   1555    png_uint_32    write_crc;         /* Output CRC (may differ from read_crc) */
   1556    png_uint_32    rewrite_offset;    /* Count of bytes before rewrite. */
   1557    int            rewrite_length;    /* Number of bytes left to change */
   1558    png_byte       rewrite_buffer[2]; /* Buffer of new byte values */
   1559 };
   1560 
   1561 static void
   1562 chunk_message(struct chunk *chunk, const char *message)
   1563 {
   1564    type_message(chunk->file, chunk->chunk_type, message);
   1565 }
   1566 
   1567 static void
   1568 chunk_end(struct chunk **chunk_var)
   1569 {
   1570    struct chunk *chunk = *chunk_var;
   1571 
   1572    *chunk_var = NULL;
   1573    CLEAR(*chunk);
   1574 }
   1575 
   1576 static void
   1577 chunk_init(struct chunk * const chunk, struct file * const file)
   1578    /* When a chunk is initialized the file length/type/pos are copied into the
   1579     * corresponding chunk fields and the new chunk is registered in the file
   1580     * structure.  There can only be one chunk at a time.
   1581     *
   1582     * NOTE: this routine must onely be called from the file alloc routine!
   1583     */
   1584 {
   1585    assert(file->chunk == NULL);
   1586 
   1587    CLEAR(*chunk);
   1588 
   1589    chunk->file = file;
   1590    chunk->global = file->global;
   1591 
   1592    chunk->chunk_data_pos = file->data_pos;
   1593    chunk->chunk_length = file->length;
   1594    chunk->chunk_type = file->type;
   1595 
   1596    /* Compresssed/uncompressed size information (from the zlib control structure
   1597     * that is used to check the compressed data in a chunk.)
   1598     */
   1599    chunk->uncompressed_digits = 0;
   1600    chunk->compressed_digits = 0;
   1601 
   1602    file->chunk = chunk;
   1603 }
   1604 
   1605 static png_uint_32
   1606 current_type(struct file *file, int code)
   1607    /* Guess the actual chunk type that causes a stop() */
   1608 {
   1609    /* This may return png_IDAT for errors detected (late) in the header; that
   1610     * includes any inter-chunk consistency check that libpng performs.  Assume
   1611     * that if the chunk_type is png_IDAT and the file write count is 8 this is
   1612     * what is happening.
   1613     */
   1614    if (file->chunk != NULL)
   1615    {
   1616       png_uint_32 type = file->chunk->chunk_type;
   1617 
   1618       /* This is probably wrong for the excess IDATs case, because then libpng
   1619        * whines about too many of them (apparently in some cases erroneously)
   1620        * when the header is read.
   1621        */
   1622       if (code <= LIBPNG_ERROR_CODE && type == png_IDAT &&
   1623          file->write_count == 8)
   1624          type = 0; /* magic */
   1625 
   1626       return type;
   1627    }
   1628 
   1629    else
   1630       return file->type;
   1631 }
   1632 
   1633 static void
   1634 setpos(struct chunk *chunk)
   1635    /* Reset the position to 'chunk_data_pos' - the start of the data for this
   1636     * chunk.  As a side effect the read_count in the file is reset to 8, just
   1637     * after the length/type header.
   1638     */
   1639 {
   1640    chunk->file->read_count = 8;
   1641    file_setpos(chunk->file, &chunk->chunk_data_pos);
   1642 }
   1643 
   1644 /* Specific chunk handling - called for each chunk header, all special chunk
   1645  * processing is initiated in these functions.
   1646  */
   1647 /* The next functions handle special processing for those chunks with LZ data,
   1648  * the data is identified and checked for validity.  If there are problems which
   1649  * cannot be corrected the routines return false, otherwise true (although
   1650  * modification to the zlib header may be required.)
   1651  *
   1652  * The compressed data is in zlib format (RFC1950) and consequently has a
   1653  * minimum length of 7 bytes.
   1654  */
   1655 static int zlib_check(struct file *file, png_uint_32 offset);
   1656 
   1657 static int
   1658 process_zTXt_iCCP(struct file *file)
   1659    /* zTXt and iCCP have exactly the same form - keyword, null, compression
   1660     * method then compressed data.
   1661     */
   1662 {
   1663    struct chunk *chunk = file->chunk;
   1664    png_uint_32 length;
   1665    png_uint_32 index = 0;
   1666 
   1667    assert(chunk != NULL && file->idat == NULL);
   1668    length = chunk->chunk_length;
   1669    setpos(chunk);
   1670 
   1671    while (length >= 9)
   1672    {
   1673       --length;
   1674       ++index;
   1675       if (reread_byte(file) == 0) /* keyword null terminator */
   1676       {
   1677          --length;
   1678          ++index;
   1679          (void)reread_byte(file); /* compression method */
   1680          return zlib_check(file, index);
   1681       }
   1682    }
   1683 
   1684    chunk_message(chunk, "too short");
   1685    return 0; /* skip */
   1686 }
   1687 
   1688 static int
   1689 process_iTXt(struct file *file)
   1690 {
   1691    /* Like zTXt but more fields. */
   1692    struct chunk *chunk = file->chunk;
   1693    png_uint_32 length;
   1694    png_uint_32 index = 0;
   1695 
   1696    assert(chunk != NULL && file->idat == NULL);
   1697    length = chunk->chunk_length;
   1698    setpos(chunk);
   1699 
   1700    while (length >= 5)
   1701    {
   1702       --length;
   1703       ++index;
   1704       if (reread_byte(file) == 0) /* keyword null terminator */
   1705       {
   1706          --length;
   1707          ++index;
   1708          if (reread_byte(file) == 0) /* uncompressed text */
   1709             return 1; /* nothing to check */
   1710 
   1711          --length;
   1712          ++index;
   1713          (void)reread_byte(file); /* compression method */
   1714 
   1715          /* Skip the language tag (null terminated). */
   1716          while (length >= 9)
   1717          {
   1718             --length;
   1719             ++index;
   1720             if (reread_byte(file) == 0) /* terminator */
   1721             {
   1722                /* Skip the translated keyword */
   1723                while (length >= 8)
   1724                {
   1725                   --length;
   1726                   ++index;
   1727                   if (reread_byte(file) == 0) /* terminator */
   1728                      return zlib_check(file, index);
   1729                }
   1730             }
   1731          }
   1732 
   1733          /* Ran out of bytes in the compressed case. */
   1734          break;
   1735       }
   1736    }
   1737 
   1738    log_error(file, INVALID_ERROR_CODE, "iTXt chunk length");
   1739 
   1740    return 0; /* skip */
   1741 }
   1742 
   1743 /* IDAT READ/WRITE CONTROL STRUCTURE */
   1744 struct IDAT
   1745 {
   1746    /* ANCESTORS */
   1747    struct file *         file;
   1748    struct global *       global;
   1749 
   1750    /* PROTECTED IDAT INFORMATION: SET BY THE IDAT READ CODE */
   1751    struct IDAT_list *idat_list_head; /* START of the list of IDAT information */
   1752    struct IDAT_list *idat_list_tail; /* *END* of the list of IDAT information */
   1753 
   1754    /* PROTECTED IDAT INFORMATION: USED BY THE IDAT WRITE CODE */
   1755    struct IDAT_list *idat_cur;       /* Current list entry */
   1756    unsigned int      idat_count;     /* And the *current* index into the list */
   1757    png_uint_32       idat_index;     /* Index of *next* input byte to write */
   1758    png_uint_32       idat_length;    /* Cache of current chunk length */
   1759 };
   1760 
   1761 /* NOTE: there is currently no IDAT_reset, so a stream cannot contain more than
   1762  * one IDAT sequence (i.e. MNG is not supported).
   1763  */
   1764 
   1765 static void
   1766 IDAT_end(struct IDAT **idat_var)
   1767 {
   1768    struct IDAT *idat = *idat_var;
   1769    struct file *file = idat->file;
   1770 
   1771    *idat_var = NULL;
   1772 
   1773    CLEAR(*idat);
   1774 
   1775    assert(file->chunk != NULL);
   1776    chunk_end(&file->chunk);
   1777 
   1778    /* Regardless of why the IDAT was killed set the state back to CHUNKS (it may
   1779     * already be CHUNKS because the state isn't changed until process_IDAT
   1780     * returns; a stop will cause IDAT_end to be entered in state CHUNKS!)
   1781     */
   1782    file->state = STATE_CHUNKS;
   1783 }
   1784 
   1785 static void
   1786 IDAT_init(struct IDAT * const idat, struct file * const file)
   1787    /* When the chunk is png_IDAT instantiate an IDAT control structure in place
   1788     * of a chunk control structure.  The IDAT will instantiate a chunk control
   1789     * structure using the file alloc routine.
   1790     *
   1791     * NOTE: this routine must only be called from the file alloc routine!
   1792     */
   1793 {
   1794    assert(file->chunk == NULL);
   1795    assert(file->idat == NULL);
   1796 
   1797    CLEAR(*idat);
   1798 
   1799    idat->file = file;
   1800    idat->global = file->global;
   1801 
   1802    /* Initialize the tail to the pre-allocated buffer and set the count to 0
   1803     * (empty.)
   1804     */
   1805    idat->global->idat_cache.count = 0;
   1806    idat->idat_list_head = idat->idat_list_tail = &idat->global->idat_cache;
   1807 
   1808    /* Now the chunk.  The allocator calls the initializer of the new chunk and
   1809     * stores the result in file->chunk:
   1810     */
   1811    file->alloc(file, 0/*chunk*/);
   1812    assert(file->chunk != NULL);
   1813 
   1814    /* And store this for cleanup (and to check for double alloc or failure to
   1815     * free.)
   1816     */
   1817    file->idat = idat;
   1818 }
   1819 
   1820 static png_uint_32
   1821 rechunk_length(struct IDAT *idat)
   1822    /* Return the length for the next IDAT chunk, taking into account
   1823     * rechunking.
   1824     */
   1825 {
   1826    png_uint_32 len = idat->global->idat_max;
   1827 
   1828    if (len == 0) /* use original chunk lengths */
   1829    {
   1830       const struct IDAT_list *cur;
   1831       unsigned int count;
   1832 
   1833       if (idat->idat_index == 0) /* at the new chunk (first time) */
   1834          return idat->idat_length; /* use the cache */
   1835 
   1836       /* Otherwise rechunk_length is called at the end of a chunk for the length
   1837        * of the next one.
   1838        */
   1839       cur = idat->idat_cur;
   1840       count = idat->idat_count;
   1841 
   1842       assert(idat->idat_index == idat->idat_length &&
   1843          idat->idat_length == cur->lengths[count]);
   1844 
   1845       /* Return length of the *next* chunk */
   1846       if (++count < cur->count)
   1847          return cur->lengths[count];
   1848 
   1849       /* End of this list */
   1850       assert(cur != idat->idat_list_tail);
   1851       cur = cur->next;
   1852       assert(cur != NULL && cur->count > 0);
   1853       return cur->lengths[0];
   1854    }
   1855 
   1856    else /* rechunking */
   1857    {
   1858       /* The chunk size is the lesser of file->idat_max and the number
   1859        * of remaining bytes.
   1860        */
   1861       png_uint_32 have = idat->idat_length - idat->idat_index;
   1862 
   1863       if (len > have)
   1864       {
   1865          struct IDAT_list *cur = idat->idat_cur;
   1866          unsigned int j = idat->idat_count+1; /* the next IDAT in the list */
   1867 
   1868          do
   1869          {
   1870             /* Add up the remaining bytes.  This can't overflow because the
   1871              * individual lengths are always <= 0x7fffffff, so when we add two
   1872              * of them overflow is not possible.
   1873              */
   1874             assert(cur != NULL);
   1875 
   1876             for (;;)
   1877             {
   1878                /* NOTE: IDAT_list::count here, not IDAT_list::length */
   1879                for (; j < cur->count; ++j)
   1880                {
   1881                   have += cur->lengths[j];
   1882                   if (len <= have)
   1883                      return len;
   1884                }
   1885 
   1886                /* If this was the end return the count of the available bytes */
   1887                if (cur == idat->idat_list_tail)
   1888                   return have;
   1889 
   1890                cur = cur->next;
   1891                j = 0;
   1892             }
   1893          }
   1894          while (len > have);
   1895       }
   1896 
   1897       return len;
   1898    }
   1899 }
   1900 
   1901 static int
   1902 process_IDAT(struct file *file)
   1903    /* Process the IDAT stream, this is the more complex than the preceding
   1904     * cases because the compressed data is spread across multiple IDAT chunks
   1905     * (typically).  Rechunking of the data is not handled here; all this
   1906     * function does is establish whether the zlib header needs to be modified.
   1907     *
   1908     * Initially the function returns false, indicating that the chunk should not
   1909     * be written.  It does this until the last IDAT chunk is passed in, then it
   1910     * checks the zlib data and returns true.
   1911     *
   1912     * It does not return false on a fatal error; it calls stop instead.
   1913     *
   1914     * The caller must have an instantiated (IDAT) control structure and it must
   1915     * have extent over the whole read of the IDAT stream.  For a PNG this means
   1916     * the whole PNG read, for MNG it could have lesser extent.
   1917     */
   1918 {
   1919    struct IDAT_list *list;
   1920 
   1921    assert(file->idat != NULL && file->chunk != NULL);
   1922 
   1923    /* We need to first check the entire sequence of IDAT chunks to ensure the
   1924     * stream is in sync.  Do this by building a list of all the chunks and
   1925     * recording the length of each because the length may have been fixed up by
   1926     * sync_stream below.
   1927     *
   1928     * At the end of the list of chunks, where the type of the next chunk is not
   1929     * png_IDAT, process the whole stream using the list data to check validity
   1930     * then return control to the start and rewrite everything.
   1931     */
   1932    list = file->idat->idat_list_tail;
   1933 
   1934    if (list->count == list->length)
   1935    {
   1936       list = IDAT_list_extend(list);
   1937 
   1938       if (list == NULL)
   1939          stop(file, READ_ERROR_CODE, "out of memory");
   1940 
   1941       /* Move to the next block */
   1942       list->count = 0;
   1943       file->idat->idat_list_tail = list;
   1944    }
   1945 
   1946    /* And fill in the next IDAT information buffer. */
   1947    list->lengths[(list->count)++] = file->chunk->chunk_length;
   1948 
   1949    /* The type of the next chunk was recorded in the file control structure by
   1950     * the caller, if this is png_IDAT return 'skip' to the caller.
   1951     */
   1952    if (file->type == png_IDAT)
   1953       return 0; /* skip this for the moment */
   1954 
   1955    /* This is the final IDAT chunk, so run the tests to check for the too far
   1956     * back error and possibly optimize the window bits.  This means going back
   1957     * to the start of the first chunk data, which is stored in the original
   1958     * chunk allocation.
   1959     */
   1960    setpos(file->chunk);
   1961 
   1962    if (zlib_check(file, 0))
   1963    {
   1964       struct IDAT *idat;
   1965       int cmp;
   1966 
   1967       /* The IDAT stream was successfully uncompressed; see whether it
   1968        * contained the correct number of bytes of image data.
   1969        */
   1970       cmp = uarb_cmp(file->image_bytes, file->image_digits,
   1971          file->chunk->uncompressed_bytes, file->chunk->uncompressed_digits);
   1972 
   1973       if (cmp < 0)
   1974          type_message(file, png_IDAT, "extra uncompressed data");
   1975 
   1976       else if (cmp > 0)
   1977          stop(file, LIBPNG_ERROR_CODE, "IDAT: uncompressed data too small");
   1978 
   1979       /* Return the stream to the start of the first IDAT chunk; the length
   1980        * is set in the write case below but the input chunk variables must be
   1981        * set (once) here:
   1982        */
   1983       setpos(file->chunk);
   1984 
   1985       idat = file->idat;
   1986       idat->idat_cur = idat->idat_list_head;
   1987       idat->idat_length = idat->idat_cur->lengths[0];
   1988       idat->idat_count = 0; /* Count of chunks read in current list */
   1989       idat->idat_index = 0; /* Index into chunk data */
   1990 
   1991       /* Update the chunk length to the correct value for the IDAT chunk: */
   1992       file->chunk->chunk_length = rechunk_length(idat);
   1993 
   1994       /* Change the state to writing IDAT chunks */
   1995       file->state = STATE_IDAT;
   1996 
   1997       return 1;
   1998    }
   1999 
   2000    else /* Failure to decompress the IDAT stream; give up. */
   2001       stop(file, ZLIB_ERROR_CODE, "could not uncompress IDAT");
   2002 }
   2003 
   2004 /* ZLIB CONTROL STRUCTURE */
   2005 struct zlib
   2006 {
   2007    /* ANCESTORS */
   2008    struct IDAT *  idat;          /* NOTE: May be NULL */
   2009    struct chunk * chunk;
   2010    struct file *  file;
   2011    struct global *global;
   2012 
   2013    /* GLOBAL ZLIB INFORMATION: SET BY THE CALLER */
   2014    png_uint_32    rewrite_offset;
   2015 
   2016    /* GLOBAL ZLIB INFORMATION: SET BY THE ZLIB READ CODE */
   2017    udigit         compressed_bytes[5];
   2018    int            compressed_digits;
   2019    udigit         uncompressed_bytes[5];
   2020    int            uncompressed_digits;
   2021    int            file_bits;             /* window bits from the file */
   2022    int            ok_bits;               /* Set <16 on a successful read */
   2023    int            cksum;                 /* Set on a checksum error */
   2024 
   2025    /* PROTECTED ZLIB INFORMATION: USED BY THE ZLIB ROUTINES */
   2026    z_stream       z;
   2027    png_uint_32    extra_bytes;   /* Count of extra compressed bytes */
   2028    int            state;
   2029    int            rc;            /* Last return code */
   2030    int            window_bits;   /* 0 if no change */
   2031    png_byte       header[2];
   2032 };
   2033 
   2034 static const char *
   2035 zlib_flevel(struct zlib *zlib)
   2036 {
   2037    switch (zlib->header[1] >> 6)
   2038    {
   2039       case 0:  return "supfast";
   2040       case 1:  return "stdfast";
   2041       case 2:  return "default";
   2042       case 3:  return "maximum";
   2043       default: assert(UNREACHED);
   2044    }
   2045 
   2046    return "COMPILER BUG";
   2047 }
   2048 
   2049 static const char *
   2050 zlib_rc(struct zlib *zlib)
   2051    /* Return a string for the zlib return code */
   2052 {
   2053    switch (zlib->rc)
   2054    {
   2055       case Z_OK:              return "Z_OK";
   2056       case Z_STREAM_END:      return "Z_STREAM_END";
   2057       case Z_NEED_DICT:       return "Z_NEED_DICT";
   2058       case Z_ERRNO:           return "Z_ERRNO";
   2059       case Z_STREAM_ERROR:    return "Z_STREAM_ERROR";
   2060       case Z_DATA_ERROR:      return "Z_DATA_ERROR";
   2061       case Z_MEM_ERROR:       return "Z_MEM_ERROR";
   2062       case Z_BUF_ERROR:       return "Z_BUF_ERROR";
   2063       case Z_VERSION_ERROR:   return "Z_VERSION_ERROR";
   2064       default:                return "Z_*INVALID_RC*";
   2065    }
   2066 }
   2067 
   2068 static void
   2069 zlib_message(struct zlib *zlib, int unexpected)
   2070    /* Output a message given a zlib rc */
   2071 {
   2072    if (zlib->global->errors)
   2073    {
   2074       const char *reason = zlib->z.msg;
   2075 
   2076       if (reason == NULL)
   2077          reason = "[no message]";
   2078 
   2079       fputs(zlib->file->file_name, stderr);
   2080       type_sep(stderr);
   2081       type_name(zlib->chunk->chunk_type, stderr);
   2082       fprintf(stderr, ": %szlib error: %d (%s) (%s)\n",
   2083          unexpected ? "unexpected " : "", zlib->rc, zlib_rc(zlib), reason);
   2084    }
   2085 }
   2086 
   2087 static void
   2088 zlib_end(struct zlib *zlib)
   2089 {
   2090    /* Output the summary line now; this ensures a summary line always gets
   2091     * output regardless of the manner of exit.
   2092     */
   2093    if (!zlib->global->quiet)
   2094    {
   2095       if (zlib->ok_bits < 16) /* stream was read ok */
   2096       {
   2097          const char *reason;
   2098 
   2099          if (zlib->cksum)
   2100             reason = "CHK"; /* checksum error */
   2101 
   2102          else if (zlib->ok_bits > zlib->file_bits)
   2103             reason = "TFB"; /* fixing a too-far-back error */
   2104 
   2105          else if (zlib->ok_bits == zlib->file_bits)
   2106             reason = "OK ";
   2107 
   2108          else
   2109             reason = "OPT"; /* optimizing window bits */
   2110 
   2111          /* SUMMARY FORMAT (for a successful zlib inflate):
   2112           *
   2113           * IDAT reason flevel file-bits ok-bits compressed uncompressed file
   2114           */
   2115          type_name(zlib->chunk->chunk_type, stdout);
   2116          printf(" %s %s %d %d ", reason, zlib_flevel(zlib), zlib->file_bits,
   2117             zlib->ok_bits);
   2118          uarb_print(zlib->compressed_bytes, zlib->compressed_digits, stdout);
   2119          putc(' ', stdout);
   2120          uarb_print(zlib->uncompressed_bytes, zlib->uncompressed_digits,
   2121             stdout);
   2122          putc(' ', stdout);
   2123          fputs(zlib->file->file_name, stdout);
   2124          putc('\n', stdout);
   2125       }
   2126 
   2127       else
   2128       {
   2129          /* This is a zlib read error; the chunk will be skipped.  For an IDAT
   2130           * stream this will also cause a fatal read error (via stop()).
   2131           *
   2132           * SUMMARY FORMAT:
   2133           *
   2134           * IDAT SKP flevel file-bits z-rc compressed message file
   2135           *
   2136           * z-rc is the zlib failure code; message is the error message with
   2137           * spaces replaced by '-'.  The compressed byte count indicates where
   2138           * in the zlib stream the error occured.
   2139           */
   2140          type_name(zlib->chunk->chunk_type, stdout);
   2141          printf(" SKP %s %d %s ", zlib_flevel(zlib), zlib->file_bits,
   2142             zlib_rc(zlib));
   2143          uarb_print(zlib->compressed_bytes, zlib->compressed_digits, stdout);
   2144          putc(' ', stdout);
   2145          emit_string(zlib->z.msg ? zlib->z.msg : "[no_message]", stdout);
   2146          putc(' ', stdout);
   2147          fputs(zlib->file->file_name, stdout);
   2148          putc('\n', stdout);
   2149       }
   2150    }
   2151 
   2152    if (zlib->state >= 0)
   2153    {
   2154       zlib->rc = inflateEnd(&zlib->z);
   2155 
   2156       if (zlib->rc != Z_OK)
   2157          zlib_message(zlib, 1/*unexpected*/);
   2158    }
   2159 
   2160    CLEAR(*zlib);
   2161 }
   2162 
   2163 static int
   2164 zlib_reset(struct zlib *zlib, int window_bits)
   2165    /* Reinitializes a zlib with a different window_bits */
   2166 {
   2167    assert(zlib->state >= 0); /* initialized by zlib_init */
   2168 
   2169    zlib->z.next_in = Z_NULL;
   2170    zlib->z.avail_in = 0;
   2171    zlib->z.next_out = Z_NULL;
   2172    zlib->z.avail_out = 0;
   2173 
   2174    zlib->window_bits = window_bits;
   2175    zlib->compressed_digits = 0;
   2176    zlib->uncompressed_digits = 0;
   2177 
   2178    zlib->state = 0; /* initialized, once */
   2179    zlib->rc = inflateReset2(&zlib->z, 0);
   2180    if (zlib->rc != Z_OK)
   2181    {
   2182       zlib_message(zlib, 1/*unexpected*/);
   2183       return 0;
   2184    }
   2185 
   2186    return 1;
   2187 }
   2188 
   2189 static int
   2190 zlib_init(struct zlib *zlib, struct IDAT *idat, struct chunk *chunk,
   2191    int window_bits, png_uint_32 offset)
   2192    /* Initialize a zlib_control; the result is true/false */
   2193 {
   2194    CLEAR(*zlib);
   2195 
   2196    zlib->idat = idat;
   2197    zlib->chunk = chunk;
   2198    zlib->file = chunk->file;
   2199    zlib->global = chunk->global;
   2200    zlib->rewrite_offset = offset; /* never changed for this zlib */
   2201 
   2202    /* *_out does not need to be set: */
   2203    zlib->z.next_in = Z_NULL;
   2204    zlib->z.avail_in = 0;
   2205    zlib->z.zalloc = Z_NULL;
   2206    zlib->z.zfree = Z_NULL;
   2207    zlib->z.opaque = Z_NULL;
   2208 
   2209    zlib->state = -1;
   2210    zlib->window_bits = window_bits;
   2211 
   2212    zlib->compressed_digits = 0;
   2213    zlib->uncompressed_digits = 0;
   2214 
   2215    /* These values are sticky across reset (in addition to the stuff in the
   2216     * first block, which is actually constant.)
   2217     */
   2218    zlib->file_bits = 16;
   2219    zlib->ok_bits = 16; /* unset */
   2220    zlib->cksum = 0; /* set when a checksum error is detected */
   2221 
   2222    /* '0' means use the header; inflateInit2 should always succeed because it
   2223     * does nothing apart from allocating the internal zstate.
   2224     */
   2225    zlib->rc = inflateInit2(&zlib->z, 0);
   2226    if (zlib->rc != Z_OK)
   2227    {
   2228       zlib_message(zlib, 1/*unexpected*/);
   2229       return 0;
   2230    }
   2231 
   2232    else
   2233    {
   2234       zlib->state = 0; /* initialized */
   2235       return 1;
   2236    }
   2237 }
   2238 
   2239 static int
   2240 max_window_bits(uarbc size, int ndigits)
   2241    /* Return the zlib stream window bits required for data of the given size. */
   2242 {
   2243    png_uint_16 cb;
   2244 
   2245    if (ndigits > 1)
   2246       return 15;
   2247 
   2248    cb = size[0];
   2249 
   2250    if (cb > 16384) return 15;
   2251    if (cb >  8192) return 14;
   2252    if (cb >  4096) return 13;
   2253    if (cb >  2048) return 12;
   2254    if (cb >  1024) return 11;
   2255    if (cb >   512) return 10;
   2256    if (cb >   256) return  9;
   2257    return 8;
   2258 }
   2259 
   2260 static int
   2261 zlib_advance(struct zlib *zlib, png_uint_32 nbytes)
   2262    /* Read nbytes compressed bytes; the stream will be initialized if required.
   2263     * Bytes are always being reread and errors are fatal.  The return code is as
   2264     * follows:
   2265     *
   2266     *    -1: saw the "too far back" error
   2267     *     0: ok, keep going
   2268     *     1: saw Z_STREAM_END (zlib->extra_bytes indicates too much data)
   2269     *     2: a zlib error that cannot be corrected (error message already
   2270     *        output if required.)
   2271     */
   2272 #  define ZLIB_TOO_FAR_BACK (-1)
   2273 #  define ZLIB_OK           0
   2274 #  define ZLIB_STREAM_END   1
   2275 #  define ZLIB_FATAL        2
   2276 {
   2277    int state = zlib->state;
   2278    int endrc = ZLIB_OK;
   2279    png_uint_32 in_bytes = 0;
   2280    struct file *file = zlib->file;
   2281 
   2282    assert(state >= 0);
   2283 
   2284    while (in_bytes < nbytes && endrc == ZLIB_OK)
   2285    {
   2286       png_uint_32 out_bytes;
   2287       int flush;
   2288       png_byte bIn = reread_byte(file);
   2289       png_byte bOut;
   2290 
   2291       switch (state)
   2292       {
   2293          case 0: /* first header byte */
   2294             {
   2295                int file_bits = 8+(bIn >> 4);
   2296                int new_bits = zlib->window_bits;
   2297 
   2298                zlib->file_bits = file_bits;
   2299 
   2300                /* Check against the existing value - it may not need to be
   2301                 * changed.
   2302                 */
   2303                if (new_bits == 0) /* no change */
   2304                   zlib->window_bits = file_bits;
   2305 
   2306                else if (new_bits != file_bits) /* rewrite required */
   2307                   bIn = (png_byte)((bIn & 0xf) + ((new_bits-8) << 4));
   2308             }
   2309 
   2310             zlib->header[0] = bIn;
   2311             zlib->state = state = 1;
   2312             break;
   2313 
   2314          case 1: /* second header byte */
   2315             {
   2316                int b2 = bIn & 0xe0; /* top 3 bits */
   2317 
   2318                /* The checksum calculation, on the first 11 bits: */
   2319                b2 += 0x1f - ((zlib->header[0] << 8) + b2) % 0x1f;
   2320 
   2321                /* Update the checksum byte if required: */
   2322                if (bIn != b2)
   2323                {
   2324                   /* If the first byte wasn't changed this indicates an error in
   2325                    * the checksum calculation; signal this by setting file_bits
   2326                    * (not window_bits) to 0.
   2327                    */
   2328                   if (zlib->file_bits == zlib->window_bits)
   2329                      zlib->cksum = 1;
   2330 
   2331                   bIn = (png_byte)b2;
   2332                }
   2333             }
   2334 
   2335             zlib->header[1] = bIn;
   2336             zlib->state = state = 2;
   2337             break;
   2338 
   2339          default: /* After the header bytes */
   2340             break;
   2341       }
   2342 
   2343       /* For some streams, perhaps only those compressed with 'superfast
   2344        * compression' (which results in a lot of copying) Z_BUF_ERROR can happen
   2345        * immediately after all output has been flushed on the next input byte.
   2346        * This is handled below when Z_BUF_ERROR is detected by adding an output
   2347        * byte.
   2348        */
   2349       zlib->z.next_in = &bIn;
   2350       zlib->z.avail_in = 1;
   2351       zlib->z.next_out = &bOut;
   2352       zlib->z.avail_out = 0;     /* Initially */
   2353 
   2354       /* Initially use Z_NO_FLUSH in an attempt to persuade zlib to look at this
   2355        * byte without confusing what is going on with output.
   2356        */
   2357       flush = Z_NO_FLUSH;
   2358       out_bytes = 0;
   2359 
   2360       /* NOTE: expression 3 is only evaluted on 'continue', because of the
   2361        * 'break' at the end of this loop below.
   2362        */
   2363       for (;endrc == ZLIB_OK;
   2364          flush = Z_SYNC_FLUSH,
   2365          zlib->z.next_out = &bOut,
   2366          zlib->z.avail_out = 1,
   2367          ++out_bytes)
   2368       {
   2369          zlib->rc = inflate(&zlib->z, flush);
   2370          out_bytes -= zlib->z.avail_out;
   2371 
   2372          switch (zlib->rc)
   2373          {
   2374             case Z_BUF_ERROR:
   2375                if (zlib->z.avail_out == 0)
   2376                   continue; /* Try another output byte. */
   2377 
   2378                if (zlib->z.avail_in == 0)
   2379                   break; /* Try another input byte */
   2380 
   2381                /* Both avail_out and avail_in are 1 yet zlib returned a code
   2382                 * indicating no progress was possible.  This is unexpected.
   2383                 */
   2384                zlib_message(zlib, 1/*unexpected*/);
   2385                endrc = ZLIB_FATAL; /* stop processing */
   2386                break;
   2387 
   2388             case Z_OK:
   2389                /* Zlib is supposed to have made progress: */
   2390                assert(zlib->z.avail_out == 0 || zlib->z.avail_in == 0);
   2391                continue;
   2392 
   2393             case Z_STREAM_END:
   2394                /* This is the successful end. */
   2395                zlib->state = 3; /* end of stream */
   2396                endrc = ZLIB_STREAM_END;
   2397                break;
   2398 
   2399             case Z_NEED_DICT:
   2400                zlib_message(zlib, 0/*stream error*/);
   2401                endrc = ZLIB_FATAL;
   2402                break;
   2403 
   2404             case Z_DATA_ERROR:
   2405                /* The too far back error can be corrected, others cannot: */
   2406                if (zlib->z.msg != NULL &&
   2407                   strcmp(zlib->z.msg, "invalid distance too far back") == 0)
   2408                {
   2409                   endrc = ZLIB_TOO_FAR_BACK;
   2410                   break;
   2411                }
   2412                /* FALL THROUGH */
   2413 
   2414             default:
   2415                zlib_message(zlib, 0/*stream error*/);
   2416                endrc = ZLIB_FATAL;
   2417                break;
   2418          } /* switch (inflate rc) */
   2419 
   2420          /* Control gets here when further output is not possible; endrc may
   2421           * still be ZLIB_OK if more input is required.
   2422           */
   2423          break;
   2424       } /* for (output bytes) */
   2425 
   2426       /* Keep a running count of output byte produced: */
   2427       zlib->uncompressed_digits = uarb_add32(zlib->uncompressed_bytes,
   2428          zlib->uncompressed_digits, out_bytes);
   2429 
   2430       /* Keep going, the loop will terminate when endrc is no longer set to
   2431        * ZLIB_OK or all the input bytes have been consumed; meanwhile keep
   2432        * adding input bytes.
   2433        */
   2434       assert(zlib->z.avail_in == 0 || endrc != ZLIB_OK);
   2435 
   2436       in_bytes += 1 - zlib->z.avail_in;
   2437    } /* while (input bytes) */
   2438 
   2439    assert(in_bytes == nbytes || endrc != ZLIB_OK);
   2440 
   2441    /* Update the running total of input bytes consumed */
   2442    zlib->compressed_digits = uarb_add32(zlib->compressed_bytes,
   2443       zlib->compressed_digits, in_bytes - zlib->z.avail_in);
   2444 
   2445    /* At the end of the stream update the chunk with the accumulated
   2446     * information if it is an improvement:
   2447     */
   2448    if (endrc == ZLIB_STREAM_END && zlib->window_bits < zlib->ok_bits)
   2449    {
   2450       struct chunk *chunk = zlib->chunk;
   2451 
   2452       chunk->uncompressed_digits = uarb_copy(chunk->uncompressed_bytes,
   2453          zlib->uncompressed_bytes, zlib->uncompressed_digits);
   2454       chunk->compressed_digits = uarb_copy(chunk->compressed_bytes,
   2455          zlib->compressed_bytes, zlib->compressed_digits);
   2456       chunk->rewrite_buffer[0] = zlib->header[0];
   2457       chunk->rewrite_buffer[1] = zlib->header[1];
   2458 
   2459       if (zlib->window_bits != zlib->file_bits || zlib->cksum)
   2460       {
   2461          /* A rewrite is required */
   2462          chunk->rewrite_offset = zlib->rewrite_offset;
   2463          chunk->rewrite_length = 2;
   2464       }
   2465 
   2466       else
   2467       {
   2468          chunk->rewrite_offset = 0;
   2469          chunk->rewrite_length = 0;
   2470       }
   2471 
   2472       if (in_bytes < nbytes)
   2473          chunk_message(chunk, "extra compressed data");
   2474 
   2475       zlib->extra_bytes = nbytes - in_bytes;
   2476       zlib->ok_bits = zlib->window_bits;
   2477    }
   2478 
   2479    return endrc;
   2480 }
   2481 
   2482 static int
   2483 zlib_run(struct zlib *zlib)
   2484    /* Like zlib_advance but also handles a stream of IDAT chunks. */
   2485 {
   2486    /* The 'extra_bytes' field is set by zlib_advance if there is extra
   2487     * compressed data in the chunk it handles (if it sees Z_STREAM_END before
   2488     * all the input data has been used.)  This function uses the value to update
   2489     * the correct chunk length, so the problem should only ever be detected once
   2490     * for each chunk.  zlib_advance outputs the error message, though see the
   2491     * IDAT specific check below.
   2492     */
   2493    zlib->extra_bytes = 0;
   2494 
   2495    if (zlib->idat != NULL)
   2496    {
   2497       struct IDAT_list *list = zlib->idat->idat_list_head;
   2498       struct IDAT_list *last = zlib->idat->idat_list_tail;
   2499       int        skip = 0;
   2500 
   2501       /* 'rewrite_offset' is the offset of the LZ data within the chunk, for
   2502        * IDAT it should be 0:
   2503        */
   2504       assert(zlib->rewrite_offset == 0);
   2505 
   2506       /* Process each IDAT_list in turn; the caller has left the stream
   2507        * positioned at the start of the first IDAT chunk data.
   2508        */
   2509       for (;;)
   2510       {
   2511          const unsigned int count = list->count;
   2512          unsigned int i;
   2513 
   2514          for (i = 0; i<count; ++i)
   2515          {
   2516             int rc;
   2517 
   2518             if (skip > 0) /* Skip CRC and next IDAT header */
   2519                skip_12(zlib->file);
   2520 
   2521             skip = 12; /* for the next time */
   2522 
   2523             rc = zlib_advance(zlib, list->lengths[i]);
   2524 
   2525             switch (rc)
   2526             {
   2527                case ZLIB_OK: /* keep going */
   2528                   break;
   2529 
   2530                case ZLIB_STREAM_END: /* stop */
   2531                   /* There may be extra chunks; if there are and one of them is
   2532                    * not zero length output the 'extra data' message.  Only do
   2533                    * this check if errors are being output.
   2534                    */
   2535                   if (zlib->global->errors && zlib->extra_bytes == 0)
   2536                   {
   2537                      struct IDAT_list *check = list;
   2538                      int j = i+1, jcount = count;
   2539 
   2540                      for (;;)
   2541                      {
   2542                         for (; j<jcount; ++j)
   2543                            if (check->lengths[j] > 0)
   2544                            {
   2545                               chunk_message(zlib->chunk,
   2546                                  "extra compressed data");
   2547                               goto end_check;
   2548                            }
   2549 
   2550                         if (check == last)
   2551                            break;
   2552 
   2553                         check = check->next;
   2554                         jcount = check->count;
   2555                         j = 0;
   2556                      }
   2557                   }
   2558 
   2559                end_check:
   2560                   /* Terminate the list at the current position, reducing the
   2561                    * length of the last IDAT too if required.
   2562                    */
   2563                   list->lengths[i] -= zlib->extra_bytes;
   2564                   list->count = i+1;
   2565                   zlib->idat->idat_list_tail = list;
   2566                   /* FALL THROUGH */
   2567 
   2568                default:
   2569                   return rc;
   2570             }
   2571          }
   2572 
   2573          /* At the end of the compressed data and Z_STREAM_END was not seen. */
   2574          if (list == last)
   2575             return ZLIB_OK;
   2576 
   2577          list = list->next;
   2578       }
   2579    }
   2580 
   2581    else
   2582    {
   2583       struct chunk *chunk = zlib->chunk;
   2584       int rc;
   2585 
   2586       assert(zlib->rewrite_offset < chunk->chunk_length);
   2587 
   2588       rc = zlib_advance(zlib, chunk->chunk_length - zlib->rewrite_offset);
   2589 
   2590       /* The extra bytes in the chunk are handled now by adjusting the chunk
   2591        * length to exclude them; the zlib data is always stored at the end of
   2592        * the PNG chunk (although clearly this is not necessary.)  zlib_advance
   2593        * has already output a warning message.
   2594        */
   2595       chunk->chunk_length -= zlib->extra_bytes;
   2596       return rc;
   2597    }
   2598 }
   2599 
   2600 static int /* global function; not a member function */
   2601 zlib_check(struct file *file, png_uint_32 offset)
   2602    /* Check the stream of zlib compressed data in either idat (if given) or (if
   2603     * not) chunk.  In fact it is zlib_run that handles the difference in reading
   2604     * a single chunk and a list of IDAT chunks.
   2605     *
   2606     * In either case the input file must be positioned at the first byte of zlib
   2607     * compressed data (the first header byte).
   2608     *
   2609     * The return value is true on success, including the case where the zlib
   2610     * header may need to be rewritten, and false on an unrecoverable error.
   2611     *
   2612     * In the case of IDAT chunks 'offset' should be 0.
   2613     */
   2614 {
   2615    fpos_t start_pos;
   2616    struct zlib zlib;
   2617 
   2618    /* Record the start of the LZ data to allow a re-read. */
   2619    file_getpos(file, &start_pos);
   2620 
   2621    /* First test the existing (file) window bits: */
   2622    if (zlib_init(&zlib, file->idat, file->chunk, 0/*window bits*/, offset))
   2623    {
   2624       int min_bits, max_bits, rc;
   2625 
   2626       /* The first run using the existing window bits. */
   2627       rc = zlib_run(&zlib);
   2628 
   2629       switch (rc)
   2630       {
   2631          case ZLIB_TOO_FAR_BACK:
   2632             /* too far back error */
   2633             file->status_code |= TOO_FAR_BACK;
   2634             min_bits = zlib.window_bits + 1;
   2635             max_bits = 15;
   2636             break;
   2637 
   2638          case ZLIB_STREAM_END:
   2639             if (!zlib.global->optimize_zlib &&
   2640                zlib.window_bits == zlib.file_bits && !zlib.cksum)
   2641             {
   2642                /* The trivial case where the stream is ok and optimization was
   2643                 * not requested.
   2644                 */
   2645                zlib_end(&zlib);
   2646                return 1;
   2647             }
   2648 
   2649             max_bits = max_window_bits(zlib.uncompressed_bytes,
   2650                zlib.uncompressed_digits);
   2651             if (zlib.ok_bits < max_bits)
   2652                max_bits = zlib.ok_bits;
   2653             min_bits = 8;
   2654 
   2655             /* cksum is set if there is an error in the zlib header checksum
   2656              * calculation in the original file (and this may be the only reason
   2657              * a rewrite is required).  We can't rely on the file window bits in
   2658              * this case, so do the optimization anyway.
   2659              */
   2660             if (zlib.cksum)
   2661                chunk_message(zlib.chunk, "zlib checkum");
   2662             break;
   2663 
   2664 
   2665          case ZLIB_OK:
   2666             /* Truncated stream; unrecoverable, gets converted to ZLIB_FATAL */
   2667             zlib.z.msg = PNGZ_MSG_CAST("[truncated]");
   2668             zlib_message(&zlib, 0/*expected*/);
   2669             /* FALL THROUGH */
   2670 
   2671          default:
   2672             /* Unrecoverable error; skip the chunk; a zlib_message has already
   2673              * been output.
   2674              */
   2675             zlib_end(&zlib);
   2676             return 0;
   2677       }
   2678 
   2679       /* Optimize window bits or fix a too-far-back error.  min_bits and
   2680        * max_bits have been set appropriately, ok_bits records the bit value
   2681        * known to work.
   2682        */
   2683       while (min_bits < max_bits || max_bits < zlib.ok_bits/*if 16*/)
   2684       {
   2685          int test_bits = (min_bits + max_bits) >> 1;
   2686 
   2687          if (zlib_reset(&zlib, test_bits))
   2688          {
   2689             file_setpos(file, &start_pos);
   2690             rc = zlib_run(&zlib);
   2691 
   2692             switch (rc)
   2693             {
   2694                case ZLIB_TOO_FAR_BACK:
   2695                   min_bits = test_bits+1;
   2696                   if (min_bits > max_bits)
   2697                   {
   2698                      /* This happens when the stream really is damaged and it
   2699                       * contains a distance code that addresses bytes before
   2700                       * the start of the uncompressed data.
   2701                       */
   2702                      assert(test_bits == 15);
   2703 
   2704                      /* Output the error that wasn't output before: */
   2705                      if (zlib.z.msg == NULL)
   2706                         zlib.z.msg = PNGZ_MSG_CAST(
   2707                            "invalid distance too far back");
   2708                      zlib_message(&zlib, 0/*stream error*/);
   2709                      zlib_end(&zlib);
   2710                      return 0;
   2711                   }
   2712                   break;
   2713 
   2714                case ZLIB_STREAM_END: /* success */
   2715                   max_bits = test_bits;
   2716                   break;
   2717 
   2718                default:
   2719                   /* A fatal error; this happens if a too-far-back error was
   2720                    * hiding a more serious error, zlib_advance has already
   2721                    * output a zlib_message.
   2722                    */
   2723                   zlib_end(&zlib);
   2724                   return 0;
   2725             }
   2726          }
   2727 
   2728          else /* inflateReset2 failed */
   2729          {
   2730             zlib_end(&zlib);
   2731             return 0;
   2732          }
   2733       }
   2734 
   2735       /* The loop guarantees this */
   2736       assert(zlib.ok_bits == max_bits);
   2737       zlib_end(&zlib);
   2738       return 1;
   2739    }
   2740 
   2741    else /* zlib initialization failed - skip the chunk */
   2742    {
   2743       zlib_end(&zlib);
   2744       return 0;
   2745    }
   2746 }
   2747 
   2748 /***************************** LIBPNG CALLBACKS *******************************/
   2749 /* The strategy here is to run a regular libpng PNG file read but examine the
   2750  * input data (from the file) before passing it to libpng so as to be aware of
   2751  * the state we expect libpng to be in.  Warning and error callbacks are also
   2752  * intercepted so that they can be quieted and interpreted.  Interpretation
   2753  * depends on a somewhat risky string match for known error messages; let us
   2754  * hope that this can be fixed in the next version of libpng.
   2755  *
   2756  * The control structure is pointed to by the libpng error pointer.  It contains
   2757  * that set of structures which must persist across multiple read callbacks,
   2758  * which is pretty much everything except the 'zlib' control structure.
   2759  *
   2760  * The file structure is instantiated in the caller of the per-file routine, but
   2761  * the per-file routine contains the chunk and IDAT control structures.
   2762  */
   2763 /* The three routines read_chunk, process_chunk and sync_stream can only be
   2764  * called via a call to read_chunk and only exit at a return from process_chunk.
   2765  * These routines could have been written as one confusing large routine,
   2766  * instead this code relies on the compiler to do tail call elimination.  The
   2767  * possible calls are as follows:
   2768  *
   2769  * read_chunk
   2770  *    -> sync_stream
   2771  *       -> process_chunk
   2772  *    -> process_chunk
   2773  *       -> read_chunk
   2774  *       returns
   2775  */
   2776 static void read_chunk(struct file *file);
   2777 static void
   2778 process_chunk(struct file *file, png_uint_32 file_crc, png_uint_32 next_length,
   2779    png_uint_32 next_type)
   2780    /* Called when the chunk data has been read, next_length and next_type
   2781     * will be set for the next chunk (or 0 if this is IEND).
   2782     *
   2783     * When this routine returns, chunk_length and chunk_type will be set for the
   2784     * next chunk to write because if a chunk is skipped this return calls back
   2785     * to read_chunk.
   2786     */
   2787 {
   2788    const png_uint_32 type = file->type;
   2789 
   2790    if (file->global->verbose > 1)
   2791    {
   2792       fputs("  ", stderr);
   2793       type_name(file->type, stderr);
   2794       fprintf(stderr, " %lu 0x%.8x 0x%.8x\n", (unsigned long)file->length,
   2795          file->crc ^ 0xffffffff, file_crc);
   2796    }
   2797 
   2798    /* The basic structure seems correct but the CRC may not match, in this
   2799     * case assume that it is simply a bad CRC, either wrongly calculated or
   2800     * because of damaged stream data.
   2801     */
   2802    if ((file->crc ^ 0xffffffff) != file_crc)
   2803    {
   2804       /* The behavior is set by the 'skip' setting; if it is anything other
   2805        * than SKIP_BAD_CRC ignore the bad CRC and return the chunk, with a
   2806        * corrected CRC and possibly processed, to libpng.  Otherwise skip the
   2807        * chunk, which will result in a fatal error if the chunk is critical.
   2808        */
   2809       file->status_code |= CRC_ERROR;
   2810 
   2811       /* Ignore the bad CRC  */
   2812       if (file->global->skip != SKIP_BAD_CRC)
   2813          type_message(file, type, "bad CRC");
   2814 
   2815       /* This will cause an IEND with a bad CRC to stop */
   2816       else if (CRITICAL(type))
   2817          stop(file, READ_ERROR_CODE, "bad CRC in critical chunk");
   2818 
   2819       else
   2820       {
   2821          type_message(file, type, "skipped: bad CRC");
   2822 
   2823          /* NOTE: this cannot be reached for IEND because it is critical. */
   2824          goto skip_chunk;
   2825       }
   2826    }
   2827 
   2828    /* Check for other 'skip' cases and handle these; these only apply to
   2829     * ancillary chunks (and not tRNS, which should probably have been a critical
   2830     * chunk.)
   2831     */
   2832    if (skip_chunk_type(file->global, type))
   2833       goto skip_chunk;
   2834 
   2835    /* The chunk may still be skipped if problems are detected in the LZ data,
   2836     * however the LZ data check requires a chunk.  Handle this by instantiating
   2837     * a chunk unless an IDAT is already instantiated (IDAT control structures
   2838     * instantiate their own chunk.)
   2839     */
   2840    if (type != png_IDAT)
   2841       file->alloc(file, 0/*chunk*/);
   2842 
   2843    else if (file->idat == NULL)
   2844       file->alloc(file, 1/*IDAT*/);
   2845 
   2846    else
   2847    {
   2848       /* The chunk length must be updated for process_IDAT */
   2849       assert(file->chunk != NULL);
   2850       assert(file->chunk->chunk_type == png_IDAT);
   2851       file->chunk->chunk_length = file->length;
   2852    }
   2853 
   2854    /* Record the 'next' information too, now that the original values for
   2855     * this chunk have been copied.  Notice that the IDAT chunks only make a
   2856     * copy of the position of the first chunk, this is fine - process_IDAT does
   2857     * not need the position of this chunk.
   2858     */
   2859    file->length = next_length;
   2860    file->type = next_type;
   2861    getpos(file);
   2862 
   2863    /* Do per-type processing, note that if this code does not return from the
   2864     * function the chunk will be skipped.  The rewrite is cancelled here so that
   2865     * it can be set in the per-chunk processing.
   2866     */
   2867    file->chunk->rewrite_length = 0;
   2868    file->chunk->rewrite_offset = 0;
   2869    switch (type)
   2870    {
   2871       default:
   2872          return;
   2873 
   2874       case png_IHDR:
   2875          /* Read this now and update the control structure with the information
   2876           * it contains.  The header is validated completely to ensure this is a
   2877           * PNG.
   2878           */
   2879          {
   2880             struct chunk *chunk = file->chunk;
   2881 
   2882             if (chunk->chunk_length != 13)
   2883                stop_invalid(file, "IHDR length");
   2884 
   2885             /* Read all the IHDR information and validate it. */
   2886             setpos(chunk);
   2887             file->width = reread_4(file);
   2888             file->height = reread_4(file);
   2889             file->bit_depth = reread_byte(file);
   2890             file->color_type = reread_byte(file);
   2891             file->compression_method = reread_byte(file);
   2892             file->filter_method = reread_byte(file);
   2893             file->interlace_method = reread_byte(file);
   2894 
   2895             /* This validates all the fields, and calls stop_invalid if
   2896              * there is a problem.
   2897              */
   2898             calc_image_size(file);
   2899          }
   2900          return;
   2901 
   2902          /* Ancillary chunks that require further processing: */
   2903       case png_zTXt: case png_iCCP:
   2904          if (process_zTXt_iCCP(file))
   2905             return;
   2906          chunk_end(&file->chunk);
   2907          file_setpos(file, &file->data_pos);
   2908          break;
   2909 
   2910       case png_iTXt:
   2911          if (process_iTXt(file))
   2912             return;
   2913          chunk_end(&file->chunk);
   2914          file_setpos(file, &file->data_pos);
   2915          break;
   2916 
   2917       case png_IDAT:
   2918          if (process_IDAT(file))
   2919             return;
   2920          /* First pass: */
   2921          assert(next_type == png_IDAT);
   2922          break;
   2923    }
   2924 
   2925    /* Control reaches this point if the chunk must be skipped.  For chunks other
   2926     * than IDAT this means that the zlib compressed data is fatally damanged and
   2927     * the chunk will not be passed to libpng.  For IDAT it means that the end of
   2928     * the IDAT stream has not yet been reached and we must handle the next
   2929     * (IDAT) chunk.  If the LZ data in an IDAT stream cannot be read 'stop' must
   2930     * be used to halt parsing of the PNG.
   2931     */
   2932    read_chunk(file);
   2933    return;
   2934 
   2935    /* This is the generic code to skip the current chunk; simply jump to the
   2936     * next one.
   2937     */
   2938 skip_chunk:
   2939    file->length = next_length;
   2940    file->type = next_type;
   2941    getpos(file);
   2942    read_chunk(file);
   2943 }
   2944 
   2945 static png_uint_32
   2946 get32(png_bytep buffer, int offset)
   2947    /* Read a 32-bit value from an 8-byte circular buffer (used only below).
   2948     */
   2949 {
   2950    return
   2951       (buffer[ offset    & 7] << 24) +
   2952       (buffer[(offset+1) & 7] << 16) +
   2953       (buffer[(offset+2) & 7] <<  8) +
   2954       (buffer[(offset+3) & 7]      );
   2955 }
   2956 
   2957 static void
   2958 sync_stream(struct file *file)
   2959    /* The stream seems to be messed up, attempt to resync from the current chunk
   2960     * header.  Executes stop on a fatal error, otherwise calls process_chunk.
   2961     */
   2962 {
   2963    png_uint_32 file_crc;
   2964 
   2965    file->status_code |= STREAM_ERROR;
   2966 
   2967    if (file->global->verbose)
   2968    {
   2969       fputs(" SYNC ", stderr);
   2970       type_name(file->type, stderr);
   2971       putc('\n', stderr);
   2972    }
   2973 
   2974    /* Return to the start of the chunk data */
   2975    file_setpos(file, &file->data_pos);
   2976    file->read_count = 8;
   2977 
   2978    if (read_4(file, &file_crc) == 4) /* else completely truncated */
   2979    {
   2980       /* Ignore the recorded chunk length, proceed through the data looking for
   2981        * a leading sequence of bytes that match the CRC in the following four
   2982        * bytes.  Each time a match is found check the next 8 bytes for a valid
   2983        * length, chunk-type pair.
   2984        */
   2985       png_uint_32 length;
   2986       png_uint_32 type = file->type;
   2987       png_uint_32 crc = crc_init_4(type);
   2988       png_byte buffer[8];
   2989       unsigned int nread = 0, nused = 0;
   2990 
   2991       for (length=0; length <= 0x7fffffff; ++length)
   2992       {
   2993          int ch;
   2994 
   2995          if ((crc ^ 0xffffffff) == file_crc)
   2996          {
   2997             /* A match on the CRC; for IEND this is sufficient, but for anything
   2998              * else expect a following chunk header.
   2999              */
   3000             if (type == png_IEND)
   3001             {
   3002                file->length = length;
   3003                process_chunk(file, file_crc, 0, 0);
   3004                return;
   3005             }
   3006 
   3007             else
   3008             {
   3009                /* Need 8 bytes */
   3010                while (nread < 8+nused)
   3011                {
   3012                   ch = read_byte(file);
   3013                   if (ch == EOF)
   3014                      goto truncated;
   3015                   buffer[(nread++) & 7] = (png_byte)ch;
   3016                }
   3017 
   3018                /* Prevent overflow */
   3019                nread -= nused & ~7;
   3020                nused -= nused & ~7; /* or, nused &= 7 ;-) */
   3021 
   3022                /* Examine the 8 bytes for a valid chunk header. */
   3023                {
   3024                   png_uint_32 next_length = get32(buffer, nused);
   3025 
   3026                   if (next_length < 0x7fffffff)
   3027                   {
   3028                      png_uint_32 next_type = get32(buffer, nused+4);
   3029 
   3030                      if (chunk_type_valid(next_type))
   3031                      {
   3032                         file->read_count -= 8;
   3033                         process_chunk(file, file_crc, next_length, next_type);
   3034                         return;
   3035                      }
   3036                   }
   3037 
   3038                   /* Not valid, keep going. */
   3039                }
   3040             }
   3041          }
   3042 
   3043          /* This catches up with the circular buffer which gets filled above
   3044           * while checking a chunk header.  This code is slightly tricky - if
   3045           * the chunk_type is IEND the buffer will never be used, if it is not
   3046           * the code will always read ahead exactly 8 bytes and pass this on to
   3047           * process_chunk.  So the invariant that IEND leaves the file position
   3048           * after the IEND CRC and other chunk leave it after the *next* chunk
   3049           * header is not broken.
   3050           */
   3051          if (nread <= nused)
   3052          {
   3053             ch = read_byte(file);
   3054 
   3055             if (ch == EOF)
   3056                goto truncated;
   3057          }
   3058 
   3059          else
   3060             ch = buffer[(++nused) & 7];
   3061 
   3062          crc = crc_one_byte(crc, file_crc >> 24);
   3063          file_crc = (file_crc << 8) + ch;
   3064       }
   3065 
   3066       /* Control gets to here if when 0x7fffffff bytes (plus 8) have been read,
   3067        * ok, treat this as a damaged stream too:
   3068        */
   3069    }
   3070 
   3071 truncated:
   3072    stop(file, READ_ERROR_CODE, "damaged PNG stream");
   3073 }
   3074 
   3075 static void
   3076 read_chunk(struct file *file)
   3077    /* On entry file::data_pos must be set to the position of the first byte
   3078     * of the chunk data *and* the input file must be at this position.  This
   3079     * routine (via process_chunk) instantiates a chunk or IDAT control structure
   3080     * based on file::length and file::type and also resets these fields and
   3081     * file::data_pos for the chunk after this one.  For an IDAT chunk the whole
   3082     * stream of IDATs will be read, until something other than an IDAT is
   3083     * encountered, and the file fields will be set for the chunk after the end
   3084     * of the stream of IDATs.
   3085     *
   3086     * For IEND the file::type field will be set to 0, and nothing beyond the end
   3087     * of the IEND chunk will have been read.
   3088     */
   3089 {
   3090    png_uint_32 length = file->length;
   3091    png_uint_32 type = file->type;
   3092 
   3093    /* After IEND file::type is set to 0, if libpng attempts to read
   3094     * more data at this point this is a bug in libpng.
   3095     */
   3096    if (type == 0)
   3097       stop(file, UNEXPECTED_ERROR_CODE, "read beyond IEND");
   3098 
   3099    if (file->global->verbose > 2)
   3100    {
   3101       fputs("   ", stderr);
   3102       type_name(type, stderr);
   3103       fprintf(stderr, " %lu\n", (unsigned long)length);
   3104    }
   3105 
   3106    /* Start the read_crc calculation with the chunk type, then read to the end
   3107     * of the chunk data (without processing it in any way) to check that it is
   3108     * all there and calculate the CRC.
   3109     */
   3110    file->crc = crc_init_4(type);
   3111    if (crc_read_many(file, length)) /* else it was truncated */
   3112    {
   3113       png_uint_32 file_crc; /* CRC read from file */
   3114       unsigned int nread = read_4(file, &file_crc);
   3115 
   3116       if (nread == 4)
   3117       {
   3118          if (type != png_IEND) /* do not read beyond IEND */
   3119          {
   3120             png_uint_32 next_length;
   3121 
   3122             nread += read_4(file, &next_length);
   3123             if (nread == 8 && next_length <= 0x7fffffff)
   3124             {
   3125                png_uint_32 next_type;
   3126 
   3127                nread += read_4(file, &next_type);
   3128 
   3129                if (nread == 12 && chunk_type_valid(next_type))
   3130                {
   3131                   /* Adjust the read count back to the correct value for this
   3132                    * chunk.
   3133                    */
   3134                   file->read_count -= 8;
   3135                   process_chunk(file, file_crc, next_length, next_type);
   3136                   return;
   3137                }
   3138             }
   3139          }
   3140 
   3141          else /* IEND */
   3142          {
   3143             process_chunk(file, file_crc, 0, 0);
   3144             return;
   3145          }
   3146       }
   3147    }
   3148 
   3149    /* Control gets to here if the the stream seems invalid or damaged in some
   3150     * way.  Either there was a problem reading all the expected data (this
   3151     * chunk's data, its CRC and the length and type of the next chunk) or the
   3152     * next chunk length/type are invalid.  Notice that the cases that end up
   3153     * here all correspond to cases that would otherwise terminate the read of
   3154     * the PNG file.
   3155     */
   3156    sync_stream(file);
   3157 }
   3158 
   3159 /* This returns a file* from a png_struct in an implementation specific way. */
   3160 static struct file *get_control(png_const_structrp png_ptr);
   3161 
   3162 static void PNGCBAPI
   3163 error_handler(png_structp png_ptr, png_const_charp message)
   3164 {
   3165    stop(get_control(png_ptr),  LIBPNG_ERROR_CODE, message);
   3166 }
   3167 
   3168 static void PNGCBAPI
   3169 warning_handler(png_structp png_ptr, png_const_charp message)
   3170 {
   3171    struct file *file = get_control(png_ptr);
   3172 
   3173    if (file->global->warnings)
   3174       emit_error(file, LIBPNG_WARNING_CODE, message);
   3175 }
   3176 
   3177 /* Read callback - this is where the work gets done to check the stream before
   3178  * passing it to libpng
   3179  */
   3180 static void PNGCBAPI
   3181 read_callback(png_structp png_ptr, png_bytep buffer, size_t count)
   3182    /* Return 'count' bytes to libpng in 'buffer' */
   3183 {
   3184    struct file *file = get_control(png_ptr);
   3185    png_uint_32 type, length; /* For the chunk be *WRITTEN* */
   3186    struct chunk *chunk;
   3187 
   3188    /* libpng should always ask for at least one byte */
   3189    if (count == 0)
   3190       stop(file, UNEXPECTED_ERROR_CODE, "read callback for 0 bytes");
   3191 
   3192    /* The callback always reads ahead by 8 bytes - the signature or chunk header
   3193     * - these bytes are stored in chunk_length and chunk_type.  This block is
   3194     * executed once for the signature and once for the first chunk right at the
   3195     * start.
   3196     */
   3197    if (file->read_count < 8)
   3198    {
   3199       assert(file->read_count == 0);
   3200       assert((file->status_code & TRUNCATED) == 0);
   3201 
   3202       (void)read_4(file, &file->length);
   3203 
   3204       if (file->read_count == 4)
   3205          (void)read_4(file, &file->type);
   3206 
   3207       if (file->read_count < 8)
   3208       {
   3209          assert((file->status_code & TRUNCATED) != 0);
   3210          stop(file, READ_ERROR_CODE, "not a PNG (too short)");
   3211       }
   3212 
   3213       if (file->state == STATE_SIGNATURE)
   3214       {
   3215          if (file->length != sig1 || file->type != sig2)
   3216             stop(file, LIBPNG_ERROR_CODE, "not a PNG (signature)");
   3217 
   3218          /* Else write it (this is the initialization of write_count, prior to
   3219           * this it contains CLEAR garbage.)
   3220           */
   3221          file->write_count = 0;
   3222       }
   3223 
   3224       else
   3225       {
   3226          assert(file->state == STATE_CHUNKS);
   3227 
   3228          /* The first chunk must be a well formed IHDR (this could be relaxed to
   3229           * use the checks in process_chunk, but that seems unnecessary.)
   3230           */
   3231          if (file->length != 13 || file->type != png_IHDR)
   3232             stop(file, LIBPNG_ERROR_CODE, "not a PNG (IHDR)");
   3233 
   3234          /* The position of the data must be stored too */
   3235          getpos(file);
   3236       }
   3237    }
   3238 
   3239    /* Retrieve previous state (because the read callbacks are made pretty much
   3240     * byte-by-byte in the sequential reader prior to 1.7).
   3241     */
   3242    chunk = file->chunk;
   3243 
   3244    if (chunk != NULL)
   3245    {
   3246       length = chunk->chunk_length;
   3247       type = chunk->chunk_type;
   3248    }
   3249 
   3250    else
   3251    {
   3252       /* This is the signature case; for IDAT and other chunks these values will
   3253        * be overwritten when read_chunk is called below.
   3254        */
   3255       length = file->length;
   3256       type = file->type;
   3257    }
   3258 
   3259    do
   3260    {
   3261       png_uint_32 b;
   3262 
   3263       /* Complete the read of a chunk; as a side effect this also instantiates
   3264        * a chunk control structure and sets the file length/type/data_pos fields
   3265        * for the *NEXT* chunk header.
   3266        *
   3267        * NOTE: at an IDAT any following IDAT chunks will also be read and the
   3268        * next_ fields will refer to the chunk after the last IDAT.
   3269        *
   3270        * NOTE: read_chunk only returns when it has read a chunk that must now be
   3271        * written.
   3272        */
   3273       if (file->state != STATE_SIGNATURE && chunk == NULL)
   3274       {
   3275          assert(file->read_count == 8);
   3276          assert(file->idat == NULL);
   3277          read_chunk(file);
   3278          chunk = file->chunk;
   3279          assert(chunk != NULL);
   3280 
   3281          /* Do the initialization that was not done before. */
   3282          length = chunk->chunk_length;
   3283          type = chunk->chunk_type;
   3284 
   3285          /* And start writing the new chunk. */
   3286          file->write_count = 0;
   3287       }
   3288 
   3289       /* The chunk_ fields describe a chunk that must be written, or hold the
   3290        * signature.  Write the header first.  In the signature case this
   3291        * rewrites the signature.
   3292        */
   3293       switch (file->write_count)
   3294       {
   3295          case 0: b = length >> 24; break;
   3296          case 1: b = length >> 16; break;
   3297          case 2: b = length >>  8; break;
   3298          case 3: b = length      ; break;
   3299 
   3300          case 4: b = type >> 24; break;
   3301          case 5: b = type >> 16; break;
   3302          case 6: b = type >>  8; break;
   3303          case 7: b = type      ; break;
   3304 
   3305          case 8:
   3306             /* The header has been written.  If this is really the signature
   3307              * that's all that is required and we can go to normal chunk
   3308              * processing.
   3309              */
   3310             if (file->state == STATE_SIGNATURE)
   3311             {
   3312                /* The signature has been written, the tail call to read_callback
   3313                 * below (it's just a goto to the start with a decent compiler)
   3314                 * will read the IHDR header ahead and validate it.
   3315                 */
   3316                assert(length == sig1 && type == sig2);
   3317                file->read_count = 0; /* Forces a header read */
   3318                file->state = STATE_CHUNKS; /* IHDR: checked above */
   3319                read_callback(png_ptr, buffer, count);
   3320                return;
   3321             }
   3322 
   3323             else
   3324             {
   3325                assert(chunk != NULL);
   3326 
   3327                /* Set up for write, notice that repositioning the input stream
   3328                 * is only necessary if something is to be read from it.  Also
   3329                 * notice that for the IDAT stream this must only happen once -
   3330                 * on the first IDAT - to get back to the start of the list and
   3331                 * this is done inside process_IDAT:
   3332                 */
   3333                chunk->write_crc = crc_init_4(type);
   3334                if (file->state != STATE_IDAT && length > 0)
   3335                   setpos(chunk);
   3336             }
   3337             /* FALL THROUGH */
   3338 
   3339          default:
   3340             assert(chunk != NULL);
   3341 
   3342             /* NOTE: the arithmetic below overflows and gives a large positive
   3343              * png_uint_32 value until the whole chunk data has been written.
   3344              */
   3345             switch (file->write_count - length)
   3346             {
   3347                /* Write the chunk data, normally this just comes from
   3348                 * the file.  The only exception is for that part of a
   3349                 * chunk which is zlib data and which must be rewritten,
   3350                 * and IDAT chunks which can be completely
   3351                 * reconstructed.
   3352                 */
   3353                default:
   3354                   if (file->state == STATE_IDAT)
   3355                   {
   3356                      struct IDAT *idat = file->idat;
   3357 
   3358                      assert(idat != NULL);
   3359 
   3360                      /* Read an IDAT byte from the input stream of IDAT chunks.
   3361                       * Because the IDAT stream can be re-chunked this stream is
   3362                       * held in the struct IDAT members.  The chunk members, in
   3363                       * particular chunk_length (and therefore the length local)
   3364                       * refer to the output chunk.
   3365                       */
   3366                      while (idat->idat_index >= idat->idat_length)
   3367                      {
   3368                         /* Advance one chunk */
   3369                         struct IDAT_list *cur = idat->idat_cur;
   3370 
   3371                         assert(idat->idat_index == idat->idat_length);
   3372                         assert(cur != NULL && cur->count > 0);
   3373 
   3374                         /* NOTE: IDAT_list::count here, not IDAT_list::length */
   3375                         if (++(idat->idat_count) >= cur->count)
   3376                         {
   3377                            assert(idat->idat_count == cur->count);
   3378 
   3379                            /* Move on to the next IDAT_list: */
   3380                            cur = cur->next;
   3381 
   3382                            /* This is an internal error - read beyond the end of
   3383                             * the pre-calculated stream.
   3384                             */
   3385                            if (cur == NULL || cur->count == 0)
   3386                               stop(file, UNEXPECTED_ERROR_CODE,
   3387                                  "read beyond end of IDAT");
   3388 
   3389                            idat->idat_count = 0;
   3390                            idat->idat_cur = cur;
   3391                         }
   3392 
   3393                         idat->idat_index = 0;
   3394                         /* Zero length IDAT chunks are permitted, so the length
   3395                          * here may be 0.
   3396                          */
   3397                         idat->idat_length = cur->lengths[idat->idat_count];
   3398 
   3399                         /* And skip 12 bytes to the next chunk data */
   3400                         skip_12(file);
   3401                      }
   3402 
   3403                      /* The index is always that of the next byte, the rest of
   3404                       * the information is always the current IDAT chunk and the
   3405                       * current list.
   3406                       */
   3407                      ++(idat->idat_index);
   3408                   }
   3409 
   3410                   /* Read the byte from the stream. */
   3411                   b = reread_byte(file);
   3412 
   3413                   /* If the byte must be rewritten handle that here */
   3414                   if (chunk->rewrite_length > 0)
   3415                   {
   3416                      if (chunk->rewrite_offset > 0)
   3417                         --(chunk->rewrite_offset);
   3418 
   3419                      else
   3420                      {
   3421                         b = chunk->rewrite_buffer[0];
   3422                         memmove(chunk->rewrite_buffer, chunk->rewrite_buffer+1,
   3423                            (sizeof chunk->rewrite_buffer)-
   3424                               (sizeof chunk->rewrite_buffer[0]));
   3425 
   3426                         --(chunk->rewrite_length);
   3427                      }
   3428                   }
   3429 
   3430                   chunk->write_crc = crc_one_byte(chunk->write_crc, b);
   3431                   break;
   3432 
   3433                /* The CRC is written at:
   3434                 *
   3435                 *    chunk_write == chunk_length+8..chunk_length+11
   3436                 *
   3437                 * so 8 to 11.  The CRC is not (yet) conditioned.
   3438                 */
   3439                case  8: b = chunk->write_crc >> 24; goto write_crc;
   3440                case  9: b = chunk->write_crc >> 16; goto write_crc;
   3441                case 10: b = chunk->write_crc >>  8; goto write_crc;
   3442                case 11:
   3443                   /* This must happen before the chunk_end below: */
   3444                   b = chunk->write_crc;
   3445 
   3446                   if (file->global->verbose > 2)
   3447                   {
   3448                      fputs("   ", stderr);
   3449                      type_name(type, stderr);
   3450                      fprintf(stderr, " %lu 0x%.8x\n", (unsigned long)length,
   3451                         chunk->write_crc ^ 0xffffffff);
   3452                   }
   3453 
   3454                   /* The IDAT stream is written without a call to read_chunk
   3455                    * until the end is reached.  rechunk_length() calculates the
   3456                    * length of the output chunks.  Control gets to this point at
   3457                    * the end of an *output* chunk - the length calculated by
   3458                    * rechunk_length.  If this corresponds to the end of the
   3459                    * input stream stop writing IDAT chunks, otherwise continue.
   3460                    */
   3461                   if (file->state == STATE_IDAT &&
   3462                      (file->idat->idat_index < file->idat->idat_length ||
   3463                       1+file->idat->idat_count < file->idat->idat_cur->count ||
   3464                       file->idat->idat_cur != file->idat->idat_list_tail))
   3465                   {
   3466                      /* Write another IDAT chunk.  Call rechunk_length to
   3467                       * calculate the length required.
   3468                       */
   3469                      length = chunk->chunk_length = rechunk_length(file->idat);
   3470                      assert(type == png_IDAT);
   3471                      file->write_count = 0; /* for the new chunk */
   3472                      --(file->write_count); /* fake out the increment below */
   3473                   }
   3474 
   3475                   else
   3476                   {
   3477                      /* Entered at the end of a non-IDAT chunk and at the end of
   3478                       * the IDAT stream.  The rewrite should have been cleared.
   3479                       */
   3480                      if (chunk->rewrite_length > 0 || chunk->rewrite_offset > 0)
   3481                         stop(file, UNEXPECTED_ERROR_CODE, "pending rewrite");
   3482 
   3483                      /* This is the last byte so reset chunk_read for the next
   3484                       * chunk and move the input file to the position after the
   3485                       * *next* chunk header if required.
   3486                       */
   3487                      file->read_count = 8;
   3488                      file_setpos(file, &file->data_pos);
   3489 
   3490                      if (file->idat == NULL)
   3491                         chunk_end(&file->chunk);
   3492 
   3493                      else
   3494                         IDAT_end(&file->idat);
   3495                   }
   3496 
   3497                write_crc:
   3498                   b ^= 0xff; /* conditioning */
   3499                   break;
   3500             }
   3501             break;
   3502       }
   3503 
   3504       /* Write one byte */
   3505       b &= 0xff;
   3506       *buffer++ = (png_byte)b;
   3507       --count;
   3508       write_byte(file, (png_byte)b); /* increments chunk_write */
   3509    }
   3510    while (count > 0);
   3511 }
   3512 
   3513 /* Bundle the file and an uninitialized chunk and IDAT control structure
   3514  * together to allow implementation of the chunk/IDAT allocate routine.
   3515  */
   3516 struct control
   3517 {
   3518    struct file  file;
   3519    struct chunk chunk;
   3520    struct IDAT  idat;
   3521 };
   3522 
   3523 static int
   3524 control_end(struct control *control)
   3525 {
   3526    return file_end(&control->file);
   3527 }
   3528 
   3529 static struct file *
   3530 get_control(png_const_structrp png_ptr)
   3531 {
   3532    /* This just returns the (file*).  The chunk and idat control structures
   3533     * don't always exist.
   3534     */
   3535    struct control *control = png_voidcast(struct control*,
   3536       png_get_error_ptr(png_ptr));
   3537    return &control->file;
   3538 }
   3539 
   3540 static void
   3541 allocate(struct file *file, int allocate_idat)
   3542 {
   3543    struct control *control = png_voidcast(struct control*, file->alloc_ptr);
   3544 
   3545    if (allocate_idat)
   3546    {
   3547       assert(file->idat == NULL);
   3548       IDAT_init(&control->idat, file);
   3549    }
   3550 
   3551    else /* chunk */
   3552    {
   3553       assert(file->chunk == NULL);
   3554       chunk_init(&control->chunk, file);
   3555    }
   3556 }
   3557 
   3558 static int
   3559 control_init(struct control *control, struct global *global,
   3560    const char *file_name, const char *out_name)
   3561    /* This wraps file_init(&control::file) and simply returns the result from
   3562     * file_init.
   3563     */
   3564 {
   3565    return file_init(&control->file, global, file_name, out_name, control,
   3566       allocate);
   3567 }
   3568 
   3569 static int
   3570 read_png(struct control *control)
   3571    /* Read a PNG, return 0 on success else an error (status) code; a bit mask as
   3572     * defined for file::status_code as above.
   3573     */
   3574 {
   3575    png_structp png_ptr;
   3576    png_infop info_ptr = NULL;
   3577    volatile png_bytep row = NULL, display = NULL;
   3578    volatile int rc;
   3579 
   3580    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, control,
   3581       error_handler, warning_handler);
   3582 
   3583    if (png_ptr == NULL)
   3584    {
   3585       /* This is not really expected. */
   3586       log_error(&control->file, LIBPNG_ERROR_CODE, "OOM allocating png_struct");
   3587       control->file.status_code |= INTERNAL_ERROR;
   3588       return LIBPNG_ERROR_CODE;
   3589    }
   3590 
   3591    rc = setjmp(control->file.jmpbuf);
   3592    if (rc == 0)
   3593    {
   3594       png_set_read_fn(png_ptr, control, read_callback);
   3595 
   3596       info_ptr = png_create_info_struct(png_ptr);
   3597       if (info_ptr == NULL)
   3598          png_error(png_ptr, "OOM allocating info structure");
   3599 
   3600       if (control->file.global->verbose)
   3601          fprintf(stderr, " INFO\n");
   3602 
   3603       png_read_info(png_ptr, info_ptr);
   3604 
   3605       {
   3606          png_size_t rowbytes = png_get_rowbytes(png_ptr, info_ptr);
   3607 
   3608          row = png_voidcast(png_byte*, malloc(rowbytes));
   3609          display = png_voidcast(png_byte*, malloc(rowbytes));
   3610 
   3611          if (row == NULL || display == NULL)
   3612             png_error(png_ptr, "OOM allocating row buffers");
   3613 
   3614          {
   3615             png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
   3616             int passes = png_set_interlace_handling(png_ptr);
   3617             int pass;
   3618 
   3619             png_start_read_image(png_ptr);
   3620 
   3621             for (pass = 0; pass < passes; ++pass)
   3622             {
   3623                png_uint_32 y = height;
   3624 
   3625                /* NOTE: this trashes the row each time; interlace handling won't
   3626                 * work, but this avoids memory thrashing for speed testing.
   3627                 */
   3628                while (y-- > 0)
   3629                   png_read_row(png_ptr, row, display);
   3630             }
   3631          }
   3632       }
   3633 
   3634       if (control->file.global->verbose)
   3635          fprintf(stderr, " END\n");
   3636 
   3637       /* Make sure to read to the end of the file: */
   3638       png_read_end(png_ptr, info_ptr);
   3639    }
   3640 
   3641    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
   3642    if (row != NULL) free(row);
   3643    if (display != NULL) free(display);
   3644    return rc;
   3645 }
   3646 
   3647 static int
   3648 one_file(struct global *global, const char *file_name, const char *out_name)
   3649 {
   3650    int rc;
   3651    struct control control;
   3652 
   3653    if (global->verbose)
   3654       fprintf(stderr, "FILE %s -> %s\n", file_name,
   3655          out_name ? out_name : "<none>");
   3656 
   3657    /* Although control_init can return a failure code the structure is always
   3658     * initialized, so control_end can be used to accumulate any status codes.
   3659     */
   3660    rc = control_init(&control, global, file_name, out_name);
   3661 
   3662    if (rc == 0)
   3663       rc = read_png(&control);
   3664 
   3665    rc |= control_end(&control);
   3666 
   3667    return rc;
   3668 }
   3669 
   3670 static void
   3671 usage(const char *prog)
   3672 {
   3673    /* ANSI C-90 limits strings to 509 characters, so use a string array: */
   3674    size_t i;
   3675    static const char *usage_string[] = {
   3676 "  Tests, optimizes and optionally fixes the zlib header in PNG files.",
   3677 "  Optionally, when fixing, strips ancilliary chunks from the file.",
   3678 0,
   3679 "OPTIONS",
   3680 "  OPERATION",
   3681 "      By default files are just checked for readability with a summary of the",
   3682 "      of zlib issues founds for each compressed chunk and the IDAT stream in",
   3683 "      the file.",
   3684 "    --optimize (-o):",
   3685 "      Find the smallest deflate window size for the compressed data.",
   3686 "    --strip=[none|crc|unsafe|unused|transform|color|all]:",
   3687 "        none (default):   Retain all chunks.",
   3688 "        crc:    Remove chunks with a bad CRC.",
   3689 "        unsafe: Remove chunks that may be unsafe to retain if the image data",
   3690 "                is modified.  This is set automatically if --max is given but",
   3691 "                may be cancelled by a later --strip=none.",
   3692 "        unused: Remove chunks not used by libpng when decoding an image.",
   3693 "                This retains any chunks that might be used by libpng image",
   3694 "                transformations.",
   3695 "        transform: unused+bKGD.",
   3696 "        color:  transform+iCCP and cHRM.",
   3697 "        all:    color+gAMA and sRGB.",
   3698 "      Only ancillary chunks are ever removed.  In addition the tRNS and sBIT",
   3699 "      chunks are never removed as they affect exact interpretation of the",
   3700 "      image pixel values.  The following known chunks are treated specially",
   3701 "      by the above options:",
   3702 "        gAMA, sRGB [all]: These specify the gamma encoding used for the pixel",
   3703 "            values.",
   3704 "        cHRM, iCCP [color]: These specify how colors are encoded.  iCCP also",
   3705 "            specifies the exact encoding of a pixel value however in practice",
   3706 "            most programs will ignore it.",
   3707 "        bKGD [transform]: This is used by libpng transforms."
   3708 "    --max=<number>:",
   3709 "      Use IDAT chunks sized <number>.  If no number is given the the IDAT",
   3710 "      chunks will be the maximum size permitted; 2^31-1 bytes.  If the option",
   3711 "      is omitted the original chunk sizes will not be changed.  When the",
   3712 "      option is given --strip=unsafe is set automatically, this may be",
   3713 "      cancelled if you know that all unknown unsafe-to-copy chunks really are",
   3714 "      safe to copy across an IDAT size change.  This is true of all chunks",
   3715 "      that have ever been formally proposed as PNG extensions.",
   3716 "  MESSAGES",
   3717 "      By default the program only outputs summaries for each file.",
   3718 "    --quiet (-q):",
   3719 "      Do not output the summaries except for files which cannot be read. With",
   3720 "      two --quiets these are not output either.",
   3721 "    --errors (-e):",
   3722 "      Output errors from libpng and the program (except too-far-back).",
   3723 "    --warnings (-w):",
   3724 "      Output warnings from libpng.",
   3725 "  OUTPUT",
   3726 "      By default nothing is written.",
   3727 "    --out=<file>:",
   3728 "      Write the optimized/corrected version of the next PNG to <file>.  This",
   3729 "      overrides the following two options",
   3730 "    --suffix=<suffix>:",
   3731 "      Set --out=<name><suffix> for all following files unless overridden on",
   3732 "      a per-file basis by explicit --out.",
   3733 "    --prefix=<prefix>:",
   3734 "      Set --out=<prefix><name> for all the following files unless overridden",
   3735 "      on a per-file basis by explicit --out.",
   3736 "      These two options can be used together to produce a suffix and prefix.",
   3737 "  INTERNAL OPTIONS",
   3738 #if 0 /*NYI*/
   3739 #ifdef PNG_MAXIMUM_INFLATE_WINDOW
   3740 "    --test:",
   3741 "      Test the PNG_MAXIMUM_INFLATE_WINDOW option.  Setting this disables",
   3742 "      output as this would produce a broken file.",
   3743 #endif
   3744 #endif
   3745 0,
   3746 "EXIT CODES",
   3747 "  *** SUBJECT TO CHANGE ***",
   3748 "  The program exit code is value in the range 0..127 holding a bit mask of",
   3749 "  the following codes.  Notice that the results for each file are combined",
   3750 "  together - check one file at a time to get a meaningful error code!",
   3751 "    0x01: The zlib too-far-back error existed in at least one chunk.",
   3752 "    0x02: At least once chunk had a CRC error.",
   3753 "    0x04: A chunk length was incorrect.",
   3754 "    0x08: The file was truncated.",
   3755 "  Errors less than 16 are potentially recoverable, for a single file if the",
   3756 "  exit code is less than 16 the file could be read (with corrections if a",
   3757 "  non-zero code is returned).",
   3758 "    0x10: The file could not be read, even with corrections.",
   3759 "    0x20: The output file could not be written.",
   3760 "    0x40: An unexpected, potentially internal, error occured.",
   3761 "  If the command line arguments are incorrect the program exits with exit",
   3762 "  255.  Some older operating systems only support 7-bit exit codes, on those",
   3763 "  systems it is suggested that this program is first tested by supplying",
   3764 "  invalid arguments.",
   3765 0,
   3766 "DESCRIPTION",
   3767 "  " PROGRAM_NAME ":",
   3768 "  checks each PNG file on the command line for errors.  By default errors are",
   3769 "  not output and the program just returns an exit code and prints a summary.",
   3770 "  With the --quiet (-q) option the summaries are suppressed too and the",
   3771 "  program only outputs unexpected errors (internal errors and file open",
   3772 "  errors).",
   3773 "  Various known problems in PNG files are fixed while the file is being read",
   3774 "  The exit code says what problems were fixed.  In particular the zlib error:",
   3775 0,
   3776 "        \"invalid distance too far back\"",
   3777 0,
   3778 "  caused by an incorrect optimization of a zlib stream is fixed in any",
   3779 "  compressed chunk in which it is encountered.  An integrity problem of the",
   3780 "  PNG stream caused by a bug in libpng which wrote an incorrect chunk length",
   3781 "  is also fixed.  Chunk CRC errors are automatically fixed up.",
   3782 0,
   3783 "  Setting one of the \"OUTPUT\" options causes the possibly modified file to",
   3784 "  be written to a new file.",
   3785 0,
   3786 "  Notice that some PNG files with the zlib optimization problem can still be",
   3787 "  read by libpng under some circumstances.  This program will still detect",
   3788 "  and, if requested, correct the error.",
   3789 0,
   3790 "  The program will reliably process all files on the command line unless",
   3791 "  either an invalid argument causes the usage message (this message) to be",
   3792 "  produced or the program crashes.",
   3793 0,
   3794 "  The summary lines describe issues encountered with the zlib compressed",
   3795 "  stream of a chunk.  They have the following format, which is SUBJECT TO",
   3796 "  CHANGE in the future:",
   3797 0,
   3798 "     chunk reason comp-level p1 p2 p3 p4 file",
   3799 0,
   3800 "  p1 through p4 vary according to the 'reason'.  There are always 8 space",
   3801 "  separated fields.  Reasons specific formats are:",
   3802 0,
   3803 "     chunk ERR status code read-errno write-errno message file",
   3804 "     chunk SKP comp-level file-bits zlib-rc compressed message file",
   3805 "     chunk ??? comp-level file-bits ok-bits compressed uncompress file",
   3806 0,
   3807 "  The various fields are",
   3808 0,
   3809 "$1 chunk:      The chunk type of a chunk in the file or 'HEAD' if a problem",
   3810 "               is reported by libpng at the start of the IDAT stream.",
   3811 "$2 reason:     One of:",
   3812 "          CHK: A zlib header checksum was detected and fixed.",
   3813 "          TFB: The zlib too far back error was detected and fixed.",
   3814 "          OK : No errors were detected in the zlib stream and optimization",
   3815 "               was not requested, or was not possible.",
   3816 "          OPT: The zlib stream window bits value could be improved (and was).",
   3817 "          SKP: The chunk was skipped because of a zlib issue (zlib-rc) with",
   3818 "               explanation 'message'",
   3819 "          ERR: The read of the file was aborted.  The parameters explain why.",
   3820 "$3 status:     For 'ERR' the accumulate status code from 'EXIT CODES' above.",
   3821 "               This is printed as a 2 digit hexadecimal value",
   3822 "   comp-level: The recorded compression level (FLEVEL) of a zlib stream",
   3823 "               expressed as a string {supfast,stdfast,default,maximum}",
   3824 "$4 code:       The file exit code; where stop was called, as a fairly terse",
   3825 "               string {warning,libpng,zlib,invalid,read,write,unexpected}.",
   3826 "   file-bits:  The zlib window bits recorded in the file.",
   3827 "$5 read-errno: A system errno value from a read translated by strerror(3).",
   3828 "   zlib-rc:    A zlib return code as a string (see zlib.h).",
   3829 "   ok-bits:    The smallest zlib window bits value that works.",
   3830 "$6 write-errno:A system errno value from a write translated by strerror(3).",
   3831 "   compressed: The count of compressed bytes in the zlib stream, when the",
   3832 "               reason is 'SKP'; this is a count of the bytes read from the",
   3833 "               stream when the fatal error was encountered.",
   3834 "$7 message:    An error message (spaces replaced by _, as in all parameters),",
   3835 "   uncompress: The count of bytes from uncompressing the zlib stream; this",
   3836 "               may not be the same as the number of bytes in the image.",
   3837 "$8 file:       The name of the file (this may contain spaces).",
   3838 };
   3839 
   3840    fprintf(stderr, "Usage: %s {[options] png-file}\n", prog);
   3841 
   3842    for (i=0; i < (sizeof usage_string)/(sizeof usage_string[0]); ++i)
   3843    {
   3844       if (usage_string[i] != 0)
   3845          fputs(usage_string[i], stderr);
   3846 
   3847       fputc('\n', stderr);
   3848    }
   3849 
   3850    exit(255);
   3851 }
   3852 
   3853 int
   3854 main(int argc, const char **argv)
   3855 {
   3856    const char *  prog = *argv;
   3857    const char *  outfile = NULL;
   3858    const char *  suffix = NULL;
   3859    const char *  prefix = NULL;
   3860    int           done = 0; /* if at least one file is processed */
   3861    struct global global;
   3862 
   3863    global_init(&global);
   3864 
   3865    while (--argc > 0)
   3866    {
   3867       ++argv;
   3868 
   3869       if (strcmp(*argv, "--debug") == 0)
   3870       {
   3871          /* To help debugging problems: */
   3872          global.errors = global.warnings = 1;
   3873          global.quiet = 0;
   3874          global.verbose = 7;
   3875       }
   3876 
   3877       else if (strncmp(*argv, "--max=", 6) == 0)
   3878       {
   3879          global.idat_max = (png_uint_32)atol(6+*argv);
   3880 
   3881          if (global.skip < SKIP_UNSAFE)
   3882             global.skip = SKIP_UNSAFE;
   3883       }
   3884 
   3885       else if (strcmp(*argv, "--max") == 0)
   3886       {
   3887          global.idat_max = 0x7fffffff;
   3888 
   3889          if (global.skip < SKIP_UNSAFE)
   3890             global.skip = SKIP_UNSAFE;
   3891       }
   3892 
   3893       else if (strcmp(*argv, "--optimize") == 0 || strcmp(*argv, "-o") == 0)
   3894          global.optimize_zlib = 1;
   3895 
   3896       else if (strncmp(*argv, "--out=", 6) == 0)
   3897          outfile = 6+*argv;
   3898 
   3899       else if (strncmp(*argv, "--suffix=", 9) == 0)
   3900          suffix = 9+*argv;
   3901 
   3902       else if (strncmp(*argv, "--prefix=", 9) == 0)
   3903          prefix = 9+*argv;
   3904 
   3905       else if (strcmp(*argv, "--strip=none") == 0)
   3906          global.skip = SKIP_NONE;
   3907 
   3908       else if (strcmp(*argv, "--strip=crc") == 0)
   3909          global.skip = SKIP_BAD_CRC;
   3910 
   3911       else if (strcmp(*argv, "--strip=unsafe") == 0)
   3912          global.skip = SKIP_UNSAFE;
   3913 
   3914       else if (strcmp(*argv, "--strip=unused") == 0)
   3915          global.skip = SKIP_UNUSED;
   3916 
   3917       else if (strcmp(*argv, "--strip=transform") == 0)
   3918          global.skip = SKIP_TRANSFORM;
   3919 
   3920       else if (strcmp(*argv, "--strip=color") == 0)
   3921          global.skip = SKIP_COLOR;
   3922 
   3923       else if (strcmp(*argv, "--strip=all") == 0)
   3924          global.skip = SKIP_ALL;
   3925 
   3926       else if (strcmp(*argv, "--errors") == 0 || strcmp(*argv, "-e") == 0)
   3927          global.errors = 1;
   3928 
   3929       else if (strcmp(*argv, "--warnings") == 0 || strcmp(*argv, "-w") == 0)
   3930          global.warnings = 1;
   3931 
   3932       else if (strcmp(*argv, "--quiet") == 0 || strcmp(*argv, "-q") == 0)
   3933       {
   3934          if (global.quiet)
   3935             global.quiet = 2;
   3936 
   3937          else
   3938             global.quiet = 1;
   3939       }
   3940 
   3941       else if (strcmp(*argv, "--verbose") == 0 || strcmp(*argv, "-v") == 0)
   3942          ++global.verbose;
   3943 
   3944 #if 0
   3945       /* NYI */
   3946 #     ifdef PNG_MAXIMUM_INFLATE_WINDOW
   3947          else if (strcmp(*argv, "--test") == 0)
   3948             ++set_option;
   3949 #     endif
   3950 #endif
   3951 
   3952       else if ((*argv)[0] == '-')
   3953          usage(prog);
   3954 
   3955       else
   3956       {
   3957          size_t outlen = strlen(*argv);
   3958          char temp_name[FILENAME_MAX+1];
   3959 
   3960          if (outfile == NULL) /* else this takes precedence */
   3961          {
   3962             /* Consider the prefix/suffix options */
   3963             if (prefix != NULL)
   3964             {
   3965                size_t prefixlen = strlen(prefix);
   3966 
   3967                if (prefixlen+outlen > FILENAME_MAX)
   3968                {
   3969                   fprintf(stderr, "%s: output file name too long: %s%s%s\n",
   3970                      prog, prefix, *argv, suffix ? suffix : "");
   3971                   global.status_code |= WRITE_ERROR;
   3972                   continue;
   3973                }
   3974 
   3975                memcpy(temp_name, prefix, prefixlen);
   3976                memcpy(temp_name+prefixlen, *argv, outlen);
   3977                outlen += prefixlen;
   3978                outfile = temp_name;
   3979             }
   3980 
   3981             else if (suffix != NULL)
   3982                memcpy(temp_name, *argv, outlen);
   3983 
   3984             temp_name[outlen] = 0;
   3985 
   3986             if (suffix != NULL)
   3987             {
   3988                size_t suffixlen = strlen(suffix);
   3989 
   3990                if (outlen+suffixlen > FILENAME_MAX)
   3991                {
   3992                   fprintf(stderr, "%s: output file name too long: %s%s\n",
   3993                      prog, *argv, suffix);
   3994                   global.status_code |= WRITE_ERROR;
   3995                   continue;
   3996                }
   3997 
   3998                memcpy(temp_name+outlen, suffix, suffixlen);
   3999                outlen += suffixlen;
   4000                temp_name[outlen] = 0;
   4001                outfile = temp_name;
   4002             }
   4003          }
   4004 
   4005          (void)one_file(&global, *argv, outfile);
   4006          ++done;
   4007          outfile = NULL;
   4008       }
   4009    }
   4010 
   4011    if (!done)
   4012       usage(prog);
   4013 
   4014    return global_end(&global);
   4015 }
   4016 
   4017 #else /* PNG_ZLIB_VERNUM < 0x1240 */
   4018 int
   4019 main(void)
   4020 {
   4021    fprintf(stderr,
   4022       "pngfix needs libpng with a zlib >=1.2.4 (not 0x%x)\n",
   4023       PNG_ZLIB_VERNUM);
   4024    return 77;
   4025 }
   4026 #endif /* PNG_ZLIB_VERNUM */
   4027 
   4028 #else /* No read support */
   4029 
   4030 int
   4031 main(void)
   4032 {
   4033    fprintf(stderr, "pngfix does not work without read support\n");
   4034    return 77;
   4035 }
   4036 #endif /* PNG_READ_SUPPORTED && PNG_EASY_ACCESS_SUPPORTED */
   4037