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