pngrutil.c 140.3 KB
Newer Older
1

A
Andreas Dilger 已提交
2
/* pngrutil.c - utilities to read a PNG file
3
 *
4
 * Last changed in libpng 1.6.27 [(PENDING RELEASE)]
5
 * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
6 7
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8
 *
9
 * This code is released under the libpng license.
10
 * For conditions of distribution and use, see the disclaimer
11
 * and license in png.h
12
 *
13
 * This file contains routines that are only called from within
14 15
 * libpng itself during the course of reading an image.
 */
G
Guy Schalnat 已提交
16

17
#include "pngpriv.h"
18

19 20
#ifdef PNG_READ_SUPPORTED

21
png_uint_32 PNGAPI
22
png_get_uint_31(png_const_structrp png_ptr, png_const_bytep buf)
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
{
   png_uint_32 uval = png_get_uint_32(buf);

   if (uval > PNG_UINT_31_MAX)
      png_error(png_ptr, "PNG unsigned integer out of range");

   return (uval);
}

#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED)
/* The following is a variation on the above for use with the fixed
 * point values used for gAMA and cHRM.  Instead of png_error it
 * issues a warning and returns (-1) - an invalid value because both
 * gAMA and cHRM use *unsigned* integers for fixed point values.
 */
#define PNG_FIXED_ERROR (-1)

static png_fixed_point /* PRIVATE */
41
png_get_fixed_point(png_structrp png_ptr, png_const_bytep buf)
G
[devel]  
Glenn Randers-Pehrson 已提交
42
{
43 44 45 46 47 48 49 50 51 52
   png_uint_32 uval = png_get_uint_32(buf);

   if (uval <= PNG_UINT_31_MAX)
      return (png_fixed_point)uval; /* known to be in range */

   /* The caller can turn off the warning by passing NULL. */
   if (png_ptr != NULL)
      png_warning(png_ptr, "PNG fixed point integer out of range");

   return PNG_FIXED_ERROR;
G
[devel]  
Glenn Randers-Pehrson 已提交
53
}
54 55 56 57 58 59 60 61 62 63 64 65
#endif

#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
/* NOTE: the read macros will obscure these definitions, so that if
 * PNG_USE_READ_MACROS is set the library will not use them internally,
 * but the APIs will still be available externally.
 *
 * The parentheses around "PNGAPI function_name" in the following three
 * functions are necessary because they allow the macros to co-exist with
 * these (unused but exported) functions.
 */

66
/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */
67 68
png_uint_32 (PNGAPI
png_get_uint_32)(png_const_bytep buf)
G
Guy Schalnat 已提交
69
{
70 71 72 73 74
   png_uint_32 uval =
       ((png_uint_32)(*(buf    )) << 24) +
       ((png_uint_32)(*(buf + 1)) << 16) +
       ((png_uint_32)(*(buf + 2)) <<  8) +
       ((png_uint_32)(*(buf + 3))      ) ;
G
Guy Schalnat 已提交
75

76
   return uval;
G
Guy Schalnat 已提交
77 78
}

79
/* Grab a signed 32-bit integer from a buffer in big-endian format.  The
80 81 82
 * data is stored in the PNG file in two's complement format and there
 * is no guarantee that a 'png_int_32' is exactly 32 bits, therefore
 * the following code does a two's complement to native conversion.
83
 */
84 85
png_int_32 (PNGAPI
png_get_int_32)(png_const_bytep buf)
A
Andreas Dilger 已提交
86
{
87
   png_uint_32 uval = png_get_uint_32(buf);
88
   if ((uval & 0x80000000) == 0) /* non-negative */
89
      return (png_int_32)uval;
A
Andreas Dilger 已提交
90

91
   uval = (uval ^ 0xffffffff) + 1;  /* 2's complement: -x = ~x+1 */
92
   if ((uval & 0x80000000) == 0) /* no overflow */
93
      return -(png_int_32)uval;
94 95 96 97 98
   /* The following has to be safe; this function only gets called on PNG data
    * and if we get here that data is invalid.  0 is the most safe value and
    * if not then an attacker would surely just generate a PNG with 0 instead.
    */
   return 0;
A
Andreas Dilger 已提交
99 100
}

101
/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */
102 103
png_uint_16 (PNGAPI
png_get_uint_16)(png_const_bytep buf)
G
Guy Schalnat 已提交
104
{
105 106
   /* ANSI-C requires an int value to accomodate at least 16 bits so this
    * works and allows the compiler not to worry about possible narrowing
107
    * on 32-bit systems.  (Pre-ANSI systems did not make integers smaller
108 109 110 111 112 113 114 115 116
    * than 16 bits either.)
    */
   unsigned int val =
       ((unsigned int)(*buf) << 8) +
       ((unsigned int)(*(buf + 1)));

   return (png_uint_16)val;
}

117
#endif /* READ_INT_FUNCTIONS */
118 119 120

/* Read and check the PNG file signature */
void /* PRIVATE */
121
png_read_sig(png_structrp png_ptr, png_inforp info_ptr)
122 123 124 125 126 127 128 129 130
{
   png_size_t num_checked, num_to_check;

   /* Exit if the user application does not expect a signature. */
   if (png_ptr->sig_bytes >= 8)
      return;

   num_checked = png_ptr->sig_bytes;
   num_to_check = 8 - num_checked;
131

132 133 134 135 136 137 138 139
#ifdef PNG_IO_STATE_SUPPORTED
   png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE;
#endif

   /* The signature must be serialized in a single I/O call. */
   png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
   png_ptr->sig_bytes = 8;

140
   if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0)
141 142 143 144 145 146 147 148 149
   {
      if (num_checked < 4 &&
          png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
         png_error(png_ptr, "Not a PNG file");
      else
         png_error(png_ptr, "PNG file corrupted by ASCII conversion");
   }
   if (num_checked < 3)
      png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
150 151
}

152 153 154 155
/* Read the chunk header (length + type name).
 * Put the type name into png_ptr->chunk_name, and return the length.
 */
png_uint_32 /* PRIVATE */
156
png_read_chunk_header(png_structrp png_ptr)
157 158 159 160 161 162 163 164
{
   png_byte buf[8];
   png_uint_32 length;

#ifdef PNG_IO_STATE_SUPPORTED
   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_HDR;
#endif

165 166 167
   /* Read the length and the chunk name.
    * This must be performed in a single I/O call.
    */
168 169 170
   png_read_data(png_ptr, buf, 8);
   length = png_get_uint_31(png_ptr, buf);

171
   /* Put the chunk name into png_ptr->chunk_name. */
172
   png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(buf+4);
173

174 175
   png_debug2(0, "Reading %lx chunk, length = %lu",
       (unsigned long)png_ptr->chunk_name, (unsigned long)length);
176

177
   /* Reset the crc and run it over the chunk name. */
178
   png_reset_crc(png_ptr);
179
   png_calculate_crc(png_ptr, buf + 4, 4);
180

181
   /* Check to see if chunk name is valid. */
182 183
   png_check_chunk_name(png_ptr, png_ptr->chunk_name);

184 185 186 187 188 189 190
#ifdef PNG_IO_STATE_SUPPORTED
   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA;
#endif

   return length;
}

191
/* Read data, and (optionally) run it through the CRC. */
192
void /* PRIVATE */
193
png_crc_read(png_structrp png_ptr, png_bytep buf, png_uint_32 length)
G
Guy Schalnat 已提交
194
{
195 196
   if (png_ptr == NULL)
      return;
197

G
Guy Schalnat 已提交
198
   png_read_data(png_ptr, buf, length);
A
Andreas Dilger 已提交
199
   png_calculate_crc(png_ptr, buf, length);
G
Guy Schalnat 已提交
200 201
}

A
Andreas Dilger 已提交
202
/* Optionally skip data and then check the CRC.  Depending on whether we
203
 * are reading an ancillary or critical chunk, and how the program has set
204 205 206
 * things up, we may calculate the CRC on the data and print a message.
 * Returns '1' if there was a CRC error, '0' otherwise.
 */
207
int /* PRIVATE */
208
png_crc_finish(png_structrp png_ptr, png_uint_32 skip)
G
Guy Schalnat 已提交
209
{
210 211 212 213
   /* The size of the local buffer for inflate is a good guess as to a
    * reasonable size to use for buffering reads from the application.
    */
   while (skip > 0)
214
   {
215 216
      png_uint_32 len;
      png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];
217

218 219 220 221 222 223
      len = (sizeof tmpbuf);
      if (len > skip)
         len = skip;
      skip -= len;

      png_crc_read(png_ptr, tmpbuf, len);
A
Andreas Dilger 已提交
224 225
   }

226
   if (png_crc_error(png_ptr) != 0)
A
Andreas Dilger 已提交
227
   {
228
      if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0 ?
229 230
          (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0 :
          (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE) != 0)
A
Andreas Dilger 已提交
231
      {
232
         png_chunk_warning(png_ptr, "CRC error");
A
Andreas Dilger 已提交
233
      }
234

A
Andreas Dilger 已提交
235
      else
236
         png_chunk_error(png_ptr, "CRC error");
237

238
      return (1);
G
Guy Schalnat 已提交
239
   }
A
Andreas Dilger 已提交
240

241
   return (0);
G
Guy Schalnat 已提交
242 243
}

244
/* Compare the CRC stored in the PNG file with that calculated by libpng from
245 246
 * the data it has read thus far.
 */
247
int /* PRIVATE */
248
png_crc_error(png_structrp png_ptr)
A
Andreas Dilger 已提交
249 250 251
{
   png_byte crc_bytes[4];
   png_uint_32 crc;
A
Andreas Dilger 已提交
252
   int need_crc = 1;
A
Andreas Dilger 已提交
253

254
   if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)
A
Andreas Dilger 已提交
255 256 257 258 259
   {
      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
          (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
         need_crc = 0;
   }
260

261
   else /* critical */
A
Andreas Dilger 已提交
262
   {
263
      if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)
A
Andreas Dilger 已提交
264 265
         need_crc = 0;
   }
A
Andreas Dilger 已提交
266

267 268 269
#ifdef PNG_IO_STATE_SUPPORTED
   png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_CRC;
#endif
270

271
   /* The chunk CRC must be serialized in a single I/O call. */
A
Andreas Dilger 已提交
272
   png_read_data(png_ptr, crc_bytes, 4);
A
Andreas Dilger 已提交
273

274
   if (need_crc != 0)
A
Andreas Dilger 已提交
275 276
   {
      crc = png_get_uint_32(crc_bytes);
277
      return ((int)(crc != png_ptr->crc));
A
Andreas Dilger 已提交
278
   }
279

A
Andreas Dilger 已提交
280
   else
281
      return (0);
A
Andreas Dilger 已提交
282 283
}

284 285 286 287
#if defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) ||\
    defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_sCAL_SUPPORTED) ||\
    defined(PNG_READ_sPLT_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) ||\
    defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_SEQUENTIAL_READ_SUPPORTED)
288 289 290 291 292 293 294 295
/* Manage the read buffer; this simply reallocates the buffer if it is not small
 * enough (or if it is not allocated).  The routine returns a pointer to the
 * buffer; if an error occurs and 'warn' is set the routine returns NULL, else
 * it will call png_error (via png_malloc) on failure.  (warn == 2 means
 * 'silent').
 */
static png_bytep
png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn)
296
{
297
   png_bytep buffer = png_ptr->read_buffer;
298

299
   if (buffer != NULL && new_size > png_ptr->read_buffer_size)
300
   {
301 302 303 304 305 306
      png_ptr->read_buffer = NULL;
      png_ptr->read_buffer = NULL;
      png_ptr->read_buffer_size = 0;
      png_free(png_ptr, buffer);
      buffer = NULL;
   }
307

308 309
   if (buffer == NULL)
   {
310
      buffer = png_voidcast(png_bytep, png_malloc_base(png_ptr, new_size));
311 312

      if (buffer != NULL)
313
      {
314 315 316
         png_ptr->read_buffer = buffer;
         png_ptr->read_buffer_size = new_size;
      }
317

318 319
      else if (warn < 2) /* else silent */
      {
320
         if (warn != 0)
321
             png_chunk_warning(png_ptr, "insufficient memory to read chunk");
322

323
         else
324
             png_chunk_error(png_ptr, "insufficient memory to read chunk");
325
      }
326
   }
327

328 329
   return buffer;
}
330
#endif /* READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */
331 332 333 334 335 336 337

/* png_inflate_claim: claim the zstream for some nefarious purpose that involves
 * decompression.  Returns Z_OK on success, else a zlib error code.  It checks
 * the owner but, in final release builds, just issues a warning if some other
 * chunk apparently owns the stream.  Prior to release it does a png_error.
 */
static int
338
png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
339 340 341 342 343 344 345 346 347
{
   if (png_ptr->zowner != 0)
   {
      char msg[64];

      PNG_STRING_FROM_CHUNK(msg, png_ptr->zowner);
      /* So the message that results is "<chunk> using zstream"; this is an
       * internal error, but is very useful for debugging.  i18n requirements
       * are minimal.
348
       */
349
      (void)png_safecat(msg, (sizeof msg), 4, " using zstream");
350
#if PNG_RELEASE_BUILD
351 352 353 354 355
      png_chunk_warning(png_ptr, msg);
      png_ptr->zowner = 0;
#else
      png_chunk_error(png_ptr, msg);
#endif
356
   }
357

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
   /* Implementation note: unlike 'png_deflate_claim' this internal function
    * does not take the size of the data as an argument.  Some efficiency could
    * be gained by using this when it is known *if* the zlib stream itself does
    * not record the number; however, this is an illusion: the original writer
    * of the PNG may have selected a lower window size, and we really must
    * follow that because, for systems with with limited capabilities, we
    * would otherwise reject the application's attempts to use a smaller window
    * size (zlib doesn't have an interface to say "this or lower"!).
    *
    * inflateReset2 was added to zlib 1.2.4; before this the window could not be
    * reset, therefore it is necessary to always allocate the maximum window
    * size with earlier zlibs just in case later compressed chunks need it.
    */
   {
      int ret; /* zlib return code */
373
#if ZLIB_VERNUM >= 0x1240
374
      int window_bits = 0;
375

376 377 378
# if defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_MAXIMUM_INFLATE_WINDOW)
      if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) ==
          PNG_OPTION_ON)
379
      {
380
         window_bits = 15;
381 382
         png_ptr->zstream_start = 0; /* fixed window size */
      }
383

384
      else
385 386 387
      {
         png_ptr->zstream_start = 1;
      }
388
# endif
389 390

#endif /* ZLIB_VERNUM >= 0x1240 */
391

392 393
      /* Set this for safety, just in case the previous owner left pointers to
       * memory allocations.
394
       */
395 396 397 398
      png_ptr->zstream.next_in = NULL;
      png_ptr->zstream.avail_in = 0;
      png_ptr->zstream.next_out = NULL;
      png_ptr->zstream.avail_out = 0;
399

400
      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
401
      {
402
#if ZLIB_VERNUM >= 0x1240
403
         ret = inflateReset2(&png_ptr->zstream, window_bits);
404 405
#else
         ret = inflateReset(&png_ptr->zstream);
406
#endif
407
      }
408

409 410
      else
      {
411
#if ZLIB_VERNUM >= 0x1240
412
         ret = inflateInit2(&png_ptr->zstream, window_bits);
413 414
#else
         ret = inflateInit(&png_ptr->zstream);
415
#endif
416

417 418
         if (ret == Z_OK)
            png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
419 420
      }

421 422 423 424
#if ZLIB_VERNUM >= 0x1281 && \
   defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_IGNORE_ADLER32)
      if (((png_ptr->options >> PNG_IGNORE_ADLER32) & 3) == PNG_OPTION_ON)
         /* Turn off validation of the ADLER32 checksum in IDAT chunks */
425
         ret = inflateValidate(&png_ptr->zstream, 0);
426 427
#endif

428
      if (ret == Z_OK)
429
         png_ptr->zowner = owner;
430

431 432 433 434 435
      else
         png_zstream_error(png_ptr, ret);

      return ret;
   }
436

437 438 439
#ifdef window_bits
# undef window_bits
#endif
440 441
}

442
#if ZLIB_VERNUM >= 0x1240
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
/* Handle the start of the inflate stream if we called inflateInit2(strm,0);
 * in this case some zlib versions skip validation of the CINFO field and, in
 * certain circumstances, libpng may end up displaying an invalid image, in
 * contrast to implementations that call zlib in the normal way (e.g. libpng
 * 1.5).
 */
int /* PRIVATE */
png_zlib_inflate(png_structrp png_ptr, int flush)
{
   if (png_ptr->zstream_start && png_ptr->zstream.avail_in > 0)
   {
      if ((*png_ptr->zstream.next_in >> 4) > 7)
      {
         png_ptr->zstream.msg = "invalid window size (libpng)";
         return Z_DATA_ERROR;
      }

      png_ptr->zstream_start = 0;
   }

   return inflate(&png_ptr->zstream, flush);
}
#endif /* Zlib >= 1.2.4 */

467
#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED
468
#if defined(PNG_READ_zTXt_SUPPORTED) || defined (PNG_READ_iTXt_SUPPORTED)
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
/* png_inflate now returns zlib error codes including Z_OK and Z_STREAM_END to
 * allow the caller to do multiple calls if required.  If the 'finish' flag is
 * set Z_FINISH will be passed to the final inflate() call and Z_STREAM_END must
 * be returned or there has been a problem, otherwise Z_SYNC_FLUSH is used and
 * Z_OK or Z_STREAM_END will be returned on success.
 *
 * The input and output sizes are updated to the actual amounts of data consumed
 * or written, not the amount available (as in a z_stream).  The data pointers
 * are not changed, so the next input is (data+input_size) and the next
 * available output is (output+output_size).
 */
static int
png_inflate(png_structrp png_ptr, png_uint_32 owner, int finish,
    /* INPUT: */ png_const_bytep input, png_uint_32p input_size_ptr,
    /* OUTPUT: */ png_bytep output, png_alloc_size_t *output_size_ptr)
{
   if (png_ptr->zowner == owner) /* Else not claimed */
   {
      int ret;
      png_alloc_size_t avail_out = *output_size_ptr;
      png_uint_32 avail_in = *input_size_ptr;

      /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it
       * can't even necessarily handle 65536 bytes) because the type uInt is
       * "16 bits or more".  Consequently it is necessary to chunk the input to
       * zlib.  This code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the
       * maximum value that can be stored in a uInt.)  It is possible to set
       * ZLIB_IO_MAX to a lower value in pngpriv.h and this may sometimes have
       * a performance advantage, because it reduces the amount of data accessed
       * at each step and that may give the OS more time to page it in.
499
       */
500 501
      png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input);
      /* avail_in and avail_out are set below from 'size' */
502
      png_ptr->zstream.avail_in = 0;
503
      png_ptr->zstream.avail_out = 0;
504

505 506
      /* Read directly into the output if it is available (this is set to
       * a local buffer below if output is NULL).
507
       */
508 509 510 511
      if (output != NULL)
         png_ptr->zstream.next_out = output;

      do
512
      {
513 514 515 516 517 518 519 520 521 522 523 524
         uInt avail;
         Byte local_buffer[PNG_INFLATE_BUF_SIZE];

         /* zlib INPUT BUFFER */
         /* The setting of 'avail_in' used to be outside the loop; by setting it
          * inside it is possible to chunk the input to zlib and simply rely on
          * zlib to advance the 'next_in' pointer.  This allows arbitrary
          * amounts of data to be passed through zlib at the unavoidable cost of
          * requiring a window save (memcpy of up to 32768 output bytes)
          * every ZLIB_IO_MAX input bytes.
          */
         avail_in += png_ptr->zstream.avail_in; /* not consumed last time */
525

526
         avail = ZLIB_IO_MAX;
527

528 529
         if (avail_in < avail)
            avail = (uInt)avail_in; /* safe: < than ZLIB_IO_MAX */
530

531 532
         avail_in -= avail;
         png_ptr->zstream.avail_in = avail;
533

534 535 536 537 538 539 540 541 542 543 544 545 546
         /* zlib OUTPUT BUFFER */
         avail_out += png_ptr->zstream.avail_out; /* not written last time */

         avail = ZLIB_IO_MAX; /* maximum zlib can process */

         if (output == NULL)
         {
            /* Reset the output buffer each time round if output is NULL and
             * make available the full buffer, up to 'remaining_space'
             */
            png_ptr->zstream.next_out = local_buffer;
            if ((sizeof local_buffer) < avail)
               avail = (sizeof local_buffer);
547
         }
548

549 550
         if (avail_out < avail)
            avail = (uInt)avail_out; /* safe: < ZLIB_IO_MAX */
551

552 553 554 555 556 557 558 559 560
         png_ptr->zstream.avail_out = avail;
         avail_out -= avail;

         /* zlib inflate call */
         /* In fact 'avail_out' may be 0 at this point, that happens at the end
          * of the read when the final LZ end code was not passed at the end of
          * the previous chunk of input data.  Tell zlib if we have reached the
          * end of the output buffer.
          */
561
         ret = PNG_INFLATE(png_ptr, avail_out > 0 ? Z_NO_FLUSH :
562
             (finish ? Z_FINISH : Z_SYNC_FLUSH));
563 564 565 566 567 568 569 570 571 572 573 574
      } while (ret == Z_OK);

      /* For safety kill the local buffer pointer now */
      if (output == NULL)
         png_ptr->zstream.next_out = NULL;

      /* Claw back the 'size' and 'remaining_space' byte counts. */
      avail_in += png_ptr->zstream.avail_in;
      avail_out += png_ptr->zstream.avail_out;

      /* Update the input and output sizes; the updated values are the amount
       * consumed or written, effectively the inverse of what zlib uses.
575
       */
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594
      if (avail_out > 0)
         *output_size_ptr -= avail_out;

      if (avail_in > 0)
         *input_size_ptr -= avail_in;

      /* Ensure png_ptr->zstream.msg is set (even in the success case!) */
      png_zstream_error(png_ptr, ret);
      return ret;
   }

   else
   {
      /* This is a bad internal error.  The recovery assigns to the zstream msg
       * pointer, which is not owned by the caller, but this is safe; it's only
       * used on errors!
       */
      png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed");
      return Z_STREAM_ERROR;
595 596 597
   }
}

598
/*
599
 * Decompress trailing data in a chunk.  The assumption is that read_buffer
600 601 602 603 604
 * points at an allocated area holding the contents of a chunk with a
 * trailing compressed part.  What we get back is an allocated area
 * holding the original prefix part and an uncompressed version of the
 * trailing part (the malloc area passed in is freed).
 */
605 606
static int
png_decompress_chunk(png_structrp png_ptr,
607 608 609
    png_uint_32 chunklength, png_uint_32 prefix_size,
    png_alloc_size_t *newlength /* must be initialized to the maximum! */,
    int terminate /*add a '\0' to the end of the uncompressed data*/)
610
{
611 612 613 614 615 616 617 618 619
   /* TODO: implement different limits for different types of chunk.
    *
    * The caller supplies *newlength set to the maximum length of the
    * uncompressed data, but this routine allocates space for the prefix and
    * maybe a '\0' terminator too.  We have to assume that 'prefix_size' is
    * limited only by the maximum chunk size.
    */
   png_alloc_size_t limit = PNG_SIZE_MAX;

620
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
621 622 623 624 625 626 627
   if (png_ptr->user_chunk_malloc_max > 0 &&
       png_ptr->user_chunk_malloc_max < limit)
      limit = png_ptr->user_chunk_malloc_max;
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
   if (PNG_USER_CHUNK_MALLOC_MAX < limit)
      limit = PNG_USER_CHUNK_MALLOC_MAX;
# endif
628

629
   if (limit >= prefix_size + (terminate != 0))
630
   {
631
      int ret;
632

633 634 635 636
      limit -= prefix_size + (terminate != 0);

      if (limit < *newlength)
         *newlength = limit;
637

638 639
      /* Now try to claim the stream. */
      ret = png_inflate_claim(png_ptr, png_ptr->chunk_name);
640 641

      if (ret == Z_OK)
642
      {
643
         png_uint_32 lzsize = chunklength - prefix_size;
644

645
         ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
646 647
             /* input: */ png_ptr->read_buffer + prefix_size, &lzsize,
             /* output: */ NULL, newlength);
648 649

         if (ret == Z_STREAM_END)
650
         {
651 652 653 654 655 656 657 658
            /* Use 'inflateReset' here, not 'inflateReset2' because this
             * preserves the previously decided window size (otherwise it would
             * be necessary to store the previous window size.)  In practice
             * this doesn't matter anyway, because png_inflate will call inflate
             * with Z_FINISH in almost all cases, so the window will not be
             * maintained.
             */
            if (inflateReset(&png_ptr->zstream) == Z_OK)
659
            {
660 661 662 663 664 665 666
               /* Because of the limit checks above we know that the new,
                * expanded, size will fit in a size_t (let alone an
                * png_alloc_size_t).  Use png_malloc_base here to avoid an
                * extra OOM message.
                */
               png_alloc_size_t new_size = *newlength;
               png_alloc_size_t buffer_size = prefix_size + new_size +
667
                   (terminate != 0);
668
               png_bytep text = png_voidcast(png_bytep, png_malloc_base(png_ptr,
669
                   buffer_size));
670 671 672 673

               if (text != NULL)
               {
                  ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
674 675
                      png_ptr->read_buffer + prefix_size, &lzsize,
                      text + prefix_size, newlength);
676 677 678 679 680

                  if (ret == Z_STREAM_END)
                  {
                     if (new_size == *newlength)
                     {
681
                        if (terminate != 0)
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
                           text[prefix_size + *newlength] = 0;

                        if (prefix_size > 0)
                           memcpy(text, png_ptr->read_buffer, prefix_size);

                        {
                           png_bytep old_ptr = png_ptr->read_buffer;

                           png_ptr->read_buffer = text;
                           png_ptr->read_buffer_size = buffer_size;
                           text = old_ptr; /* freed below */
                        }
                     }

                     else
                     {
                        /* The size changed on the second read, there can be no
                         * guarantee that anything is correct at this point.
                         * The 'msg' pointer has been set to "unexpected end of
                         * LZ stream", which is fine, but return an error code
                         * that the caller won't accept.
                         */
                        ret = PNG_UNEXPECTED_ZLIB_RETURN;
                     }
                  }

                  else if (ret == Z_OK)
                     ret = PNG_UNEXPECTED_ZLIB_RETURN; /* for safety */

                  /* Free the text pointer (this is the old read_buffer on
                   * success)
                   */
                  png_free(png_ptr, text);

                  /* This really is very benign, but it's still an error because
                   * the extra space may otherwise be used as a Trojan Horse.
                   */
                  if (ret == Z_STREAM_END &&
720
                      chunklength - prefix_size != lzsize)
721 722 723 724 725 726 727 728 729
                     png_chunk_benign_error(png_ptr, "extra compressed data");
               }

               else
               {
                  /* Out of memory allocating the buffer */
                  ret = Z_MEM_ERROR;
                  png_zstream_error(png_ptr, Z_MEM_ERROR);
               }
730
            }
731

732 733 734 735 736 737 738 739
            else
            {
               /* inflateReset failed, store the error message */
               png_zstream_error(png_ptr, ret);

               if (ret == Z_STREAM_END)
                  ret = PNG_UNEXPECTED_ZLIB_RETURN;
            }
740 741
         }

742 743 744 745 746
         else if (ret == Z_OK)
            ret = PNG_UNEXPECTED_ZLIB_RETURN;

         /* Release the claimed stream */
         png_ptr->zowner = 0;
747
      }
748 749 750 751 752

      else /* the claim failed */ if (ret == Z_STREAM_END) /* impossible! */
         ret = PNG_UNEXPECTED_ZLIB_RETURN;

      return ret;
753
   }
754

755
   else
756
   {
757 758 759
      /* Application/configuration limits exceeded */
      png_zstream_error(png_ptr, Z_MEM_ERROR);
      return Z_MEM_ERROR;
760
   }
761
}
762
#endif /* READ_zTXt || READ_iTXt */
763
#endif /* READ_COMPRESSED_TEXT */
A
Andreas Dilger 已提交
764

765 766 767 768 769 770
#ifdef PNG_READ_iCCP_SUPPORTED
/* Perform a partial read and decompress, producing 'avail_out' bytes and
 * reading from the current chunk as required.
 */
static int
png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,
771 772
    png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size,
    int finish)
773 774
{
   if (png_ptr->zowner == png_ptr->chunk_name)
775
   {
776 777 778 779 780
      int ret;

      /* next_in and avail_in must have been initialized by the caller. */
      png_ptr->zstream.next_out = next_out;
      png_ptr->zstream.avail_out = 0; /* set in the loop */
781

782
      do
783
      {
784 785 786 787 788 789 790 791
         if (png_ptr->zstream.avail_in == 0)
         {
            if (read_size > *chunk_bytes)
               read_size = (uInt)*chunk_bytes;
            *chunk_bytes -= read_size;

            if (read_size > 0)
               png_crc_read(png_ptr, read_buffer, read_size);
792

793 794 795 796 797 798 799 800 801 802 803 804 805
            png_ptr->zstream.next_in = read_buffer;
            png_ptr->zstream.avail_in = read_size;
         }

         if (png_ptr->zstream.avail_out == 0)
         {
            uInt avail = ZLIB_IO_MAX;
            if (avail > *out_size)
               avail = (uInt)*out_size;
            *out_size -= avail;

            png_ptr->zstream.avail_out = avail;
         }
806

807 808 809 810
         /* Use Z_SYNC_FLUSH when there is no more chunk data to ensure that all
          * the available output is produced; this allows reading of truncated
          * streams.
          */
811 812
         ret = PNG_INFLATE(png_ptr, *chunk_bytes > 0 ?
             Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH));
813
      }
814 815 816 817 818 819 820 821
      while (ret == Z_OK && (*out_size > 0 || png_ptr->zstream.avail_out > 0));

      *out_size += png_ptr->zstream.avail_out;
      png_ptr->zstream.avail_out = 0; /* Should not be required, but is safe */

      /* Ensure the error message pointer is always set: */
      png_zstream_error(png_ptr, ret);
      return ret;
822 823
   }

824 825 826 827 828
   else
   {
      png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed");
      return Z_STREAM_ERROR;
   }
829
}
830
#endif /* READ_iCCP */
831

832
/* Read and check the IDHR chunk */
833

834
void /* PRIVATE */
835
png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
836 837 838 839 840 841
{
   png_byte buf[13];
   png_uint_32 width, height;
   int bit_depth, color_type, compression_type, filter_type;
   int interlace_type;

842
   png_debug(1, "in png_handle_IHDR");
A
Andreas Dilger 已提交
843

844
   if ((png_ptr->mode & PNG_HAVE_IHDR) != 0)
845
      png_chunk_error(png_ptr, "out of place");
G
Guy Schalnat 已提交
846

847
   /* Check the length */
G
Guy Schalnat 已提交
848
   if (length != 13)
849
      png_chunk_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
850

A
Andreas Dilger 已提交
851 852
   png_ptr->mode |= PNG_HAVE_IHDR;

G
Guy Schalnat 已提交
853
   png_crc_read(png_ptr, buf, 13);
A
Andreas Dilger 已提交
854
   png_crc_finish(png_ptr, 0);
G
Guy Schalnat 已提交
855

856 857
   width = png_get_uint_31(png_ptr, buf);
   height = png_get_uint_31(png_ptr, buf + 4);
G
Guy Schalnat 已提交
858 859 860 861 862 863
   bit_depth = buf[8];
   color_type = buf[9];
   compression_type = buf[10];
   filter_type = buf[11];
   interlace_type = buf[12];

864
   /* Set internal variables */
G
Guy Schalnat 已提交
865 866
   png_ptr->width = width;
   png_ptr->height = height;
867 868 869
   png_ptr->bit_depth = (png_byte)bit_depth;
   png_ptr->interlaced = (png_byte)interlace_type;
   png_ptr->color_type = (png_byte)color_type;
870
#ifdef PNG_MNG_FEATURES_SUPPORTED
871
   png_ptr->filter_type = (png_byte)filter_type;
872
#endif
873
   png_ptr->compression_type = (png_byte)compression_type;
G
Guy Schalnat 已提交
874

875
   /* Find number of channels */
G
Guy Schalnat 已提交
876 877
   switch (png_ptr->color_type)
   {
878
      default: /* invalid, png_set_IHDR calls png_error */
A
Andreas Dilger 已提交
879 880
      case PNG_COLOR_TYPE_GRAY:
      case PNG_COLOR_TYPE_PALETTE:
G
Guy Schalnat 已提交
881 882
         png_ptr->channels = 1;
         break;
883

A
Andreas Dilger 已提交
884
      case PNG_COLOR_TYPE_RGB:
G
Guy Schalnat 已提交
885 886
         png_ptr->channels = 3;
         break;
887

A
Andreas Dilger 已提交
888
      case PNG_COLOR_TYPE_GRAY_ALPHA:
G
Guy Schalnat 已提交
889 890
         png_ptr->channels = 2;
         break;
891

A
Andreas Dilger 已提交
892
      case PNG_COLOR_TYPE_RGB_ALPHA:
G
Guy Schalnat 已提交
893 894 895
         png_ptr->channels = 4;
         break;
   }
A
Andreas Dilger 已提交
896

897
   /* Set up other useful info */
898
   png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * png_ptr->channels);
899
   png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width);
900 901
   png_debug1(3, "bit_depth = %d", png_ptr->bit_depth);
   png_debug1(3, "channels = %d", png_ptr->channels);
902
   png_debug1(3, "rowbytes = %lu", (unsigned long)png_ptr->rowbytes);
A
Andreas Dilger 已提交
903
   png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,
904
       color_type, interlace_type, compression_type, filter_type);
G
Guy Schalnat 已提交
905 906
}

907
/* Read and check the palette */
908
void /* PRIVATE */
909
png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
910
{
911
   png_color palette[PNG_MAX_PALETTE_LENGTH];
912
   int max_palette_length, num, i;
913
#ifdef PNG_POINTER_INDEXING_SUPPORTED
914 915
   png_colorp pal_ptr;
#endif
G
Guy Schalnat 已提交
916

917
   png_debug(1, "in png_handle_PLTE");
A
Andreas Dilger 已提交
918

919
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
920 921 922 923 924 925 926
      png_chunk_error(png_ptr, "missing IHDR");

   /* Moved to before the 'after IDAT' check below because otherwise duplicate
    * PLTE chunks are potentially ignored (the spec says there shall not be more
    * than one PLTE, the error is not treated as benign, so this check trumps
    * the requirement that PLTE appears before IDAT.)
    */
927
   else if ((png_ptr->mode & PNG_HAVE_PLTE) != 0)
928
      png_chunk_error(png_ptr, "duplicate");
929

930
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
931
   {
932 933 934
      /* This is benign because the non-benign error happened before, when an
       * IDAT was encountered in a color-mapped image with no PLTE.
       */
A
Andreas Dilger 已提交
935
      png_crc_finish(png_ptr, length);
936
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
937 938
      return;
   }
939

A
Andreas Dilger 已提交
940
   png_ptr->mode |= PNG_HAVE_PLTE;
G
Guy Schalnat 已提交
941

942
   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
943 944
   {
      png_crc_finish(png_ptr, length);
945
      png_chunk_benign_error(png_ptr, "ignored in grayscale PNG");
946 947
      return;
   }
948

949
#ifndef PNG_READ_OPT_PLTE_SUPPORTED
G
Guy Schalnat 已提交
950 951
   if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
   {
A
Andreas Dilger 已提交
952
      png_crc_finish(png_ptr, length);
G
Guy Schalnat 已提交
953 954 955 956
      return;
   }
#endif

957
   if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3)
G
Guy Schalnat 已提交
958
   {
959 960
      png_crc_finish(png_ptr, length);

G
Guy Schalnat 已提交
961
      if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
962
         png_chunk_benign_error(png_ptr, "invalid");
963

G
Guy Schalnat 已提交
964
      else
965 966 967
         png_chunk_error(png_ptr, "invalid");

      return;
G
Guy Schalnat 已提交
968
   }
G
Guy Schalnat 已提交
969

970
   /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */
G
Guy Schalnat 已提交
971
   num = (int)length / 3;
972

973 974 975 976
   /* If the palette has 256 or fewer entries but is too large for the bit
    * depth, we don't issue an error, to preserve the behavior of previous
    * libpng versions. We silently truncate the unused extra palette entries
    * here.
977
    */
978 979 980 981 982
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
      max_palette_length = (1 << png_ptr->bit_depth);
   else
      max_palette_length = PNG_MAX_PALETTE_LENGTH;

983
   if (num > max_palette_length)
984
      num = max_palette_length;
985

986
#ifdef PNG_POINTER_INDEXING_SUPPORTED
987 988 989 990 991 992 993 994 995 996
   for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)
   {
      png_byte buf[3];

      png_crc_read(png_ptr, buf, 3);
      pal_ptr->red = buf[0];
      pal_ptr->green = buf[1];
      pal_ptr->blue = buf[2];
   }
#else
G
Guy Schalnat 已提交
997
   for (i = 0; i < num; i++)
G
Guy Schalnat 已提交
998 999 1000 1001
   {
      png_byte buf[3];

      png_crc_read(png_ptr, buf, 3);
1002
      /* Don't depend upon png_color being any order */
G
Guy Schalnat 已提交
1003 1004 1005 1006
      palette[i].red = buf[0];
      palette[i].green = buf[1];
      palette[i].blue = buf[2];
   }
1007
#endif
A
Andreas Dilger 已提交
1008

1009
   /* If we actually need the PLTE chunk (ie for a paletted image), we do
1010 1011 1012 1013
    * whatever the normal CRC configuration tells us.  However, if we
    * have an RGB image, the PLTE can be considered ancillary, so
    * we will act as though it is.
    */
1014
#ifndef PNG_READ_OPT_PLTE_SUPPORTED
A
Andreas Dilger 已提交
1015
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1016
#endif
A
Andreas Dilger 已提交
1017
   {
1018
      png_crc_finish(png_ptr, (png_uint_32) (length - (unsigned int)num * 3));
A
Andreas Dilger 已提交
1019
   }
1020

1021
#ifndef PNG_READ_OPT_PLTE_SUPPORTED
1022
   else if (png_crc_error(png_ptr) != 0)  /* Only if we have a CRC error */
A
Andreas Dilger 已提交
1023 1024
   {
      /* If we don't want to use the data from an ancillary chunk,
1025 1026 1027
       * we have two options: an error abort, or a warning and we
       * ignore the data in this chunk (which should be OK, since
       * it's considered ancillary for a RGB or RGBA image).
1028 1029 1030 1031
       *
       * IMPLEMENTATION NOTE: this is only here because png_crc_finish uses the
       * chunk type to determine whether to check the ancillary or the critical
       * flags.
1032
       */
1033
      if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE) == 0)
A
Andreas Dilger 已提交
1034
      {
1035
         if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) != 0)
1036
            return;
1037

A
Andreas Dilger 已提交
1038
         else
1039
            png_chunk_error(png_ptr, "CRC error");
A
Andreas Dilger 已提交
1040
      }
1041

A
Andreas Dilger 已提交
1042
      /* Otherwise, we (optionally) emit a warning and use the chunk. */
1043
      else if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0)
1044
         png_chunk_warning(png_ptr, "CRC error");
A
Andreas Dilger 已提交
1045
   }
1046
#endif
1047

1048 1049 1050 1051 1052 1053 1054 1055
   /* TODO: png_set_PLTE has the side effect of setting png_ptr->palette to its
    * own copy of the palette.  This has the side effect that when png_start_row
    * is called (this happens after any call to png_read_update_info) the
    * info_ptr palette gets changed.  This is extremely unexpected and
    * confusing.
    *
    * Fix this by not sharing the palette in this way.
    */
A
Andreas Dilger 已提交
1056
   png_set_PLTE(png_ptr, info_ptr, palette, num);
1057

1058 1059 1060 1061 1062 1063 1064 1065 1066
   /* The three chunks, bKGD, hIST and tRNS *must* appear after PLTE and before
    * IDAT.  Prior to 1.6.0 this was not checked; instead the code merely
    * checked the apparent validity of a tRNS chunk inserted before PLTE on a
    * palette PNG.  1.6.0 attempts to rigorously follow the standard and
    * therefore does a benign error if the erroneous condition is detected *and*
    * cancels the tRNS if the benign error returns.  The alternative is to
    * amend the standard since it would be rather hypocritical of the standards
    * maintainers to ignore it.
    */
1067
#ifdef PNG_READ_tRNS_SUPPORTED
1068
   if (png_ptr->num_trans > 0 ||
1069
       (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0))
1070
   {
1071 1072 1073 1074 1075
      /* Cancel this because otherwise it would be used if the transforms
       * require it.  Don't cancel the 'valid' flag because this would prevent
       * detection of duplicate chunks.
       */
      png_ptr->num_trans = 0;
1076

1077 1078 1079 1080
      if (info_ptr != NULL)
         info_ptr->num_trans = 0;

      png_chunk_benign_error(png_ptr, "tRNS must be after");
1081 1082 1083
   }
#endif

1084 1085 1086 1087 1088 1089 1090 1091 1092
#ifdef PNG_READ_hIST_SUPPORTED
   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)
      png_chunk_benign_error(png_ptr, "hIST must be after");
#endif

#ifdef PNG_READ_bKGD_SUPPORTED
   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)
      png_chunk_benign_error(png_ptr, "bKGD must be after");
#endif
A
Andreas Dilger 已提交
1093
}
G
Guy Schalnat 已提交
1094

1095
void /* PRIVATE */
1096
png_handle_IEND(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
A
Andreas Dilger 已提交
1097
{
1098
   png_debug(1, "in png_handle_IEND");
A
Andreas Dilger 已提交
1099

1100 1101
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0 ||
       (png_ptr->mode & PNG_HAVE_IDAT) == 0)
1102
      png_chunk_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1103

1104
   png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND);
A
Andreas Dilger 已提交
1105

1106
   png_crc_finish(png_ptr, length);
1107

1108 1109 1110 1111
   if (length != 0)
      png_chunk_benign_error(png_ptr, "invalid");

   PNG_UNUSED(info_ptr)
G
Guy Schalnat 已提交
1112 1113
}

1114
#ifdef PNG_READ_gAMA_SUPPORTED
1115
void /* PRIVATE */
1116
png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
1117
{
1118
   png_fixed_point igamma;
G
Guy Schalnat 已提交
1119 1120
   png_byte buf[4];

1121
   png_debug(1, "in png_handle_gAMA");
A
Andreas Dilger 已提交
1122

1123
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1124
      png_chunk_error(png_ptr, "missing IHDR");
1125

1126
   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
A
Andreas Dilger 已提交
1127 1128
   {
      png_crc_finish(png_ptr, length);
1129
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1130 1131
      return;
   }
G
Guy Schalnat 已提交
1132

G
Guy Schalnat 已提交
1133 1134
   if (length != 4)
   {
A
Andreas Dilger 已提交
1135
      png_crc_finish(png_ptr, length);
1136
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
1137 1138 1139 1140
      return;
   }

   png_crc_read(png_ptr, buf, 4);
1141

1142
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
1143 1144
      return;

1145
   igamma = png_get_fixed_point(NULL, buf);
G
Guy Schalnat 已提交
1146

1147 1148
   png_colorspace_set_gamma(png_ptr, &png_ptr->colorspace, igamma);
   png_colorspace_sync(png_ptr, info_ptr);
G
Guy Schalnat 已提交
1149
}
G
Guy Schalnat 已提交
1150
#endif
G
Guy Schalnat 已提交
1151

1152
#ifdef PNG_READ_sBIT_SUPPORTED
1153
void /* PRIVATE */
1154
png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
1155
{
1156 1157
   unsigned int truelen, i;
   png_byte sample_depth;
G
Guy Schalnat 已提交
1158
   png_byte buf[4];
G
Guy Schalnat 已提交
1159

1160
   png_debug(1, "in png_handle_sBIT");
A
Andreas Dilger 已提交
1161

1162
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1163
      png_chunk_error(png_ptr, "missing IHDR");
1164

1165
   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
A
Andreas Dilger 已提交
1166 1167
   {
      png_crc_finish(png_ptr, length);
1168
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1169 1170
      return;
   }
1171

1172
   if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) != 0)
A
Andreas Dilger 已提交
1173 1174
   {
      png_crc_finish(png_ptr, length);
1175
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
1176 1177
      return;
   }
G
Guy Schalnat 已提交
1178

G
Guy Schalnat 已提交
1179
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1180
   {
A
Andreas Dilger 已提交
1181
      truelen = 3;
1182 1183
      sample_depth = 8;
   }
1184

G
Guy Schalnat 已提交
1185
   else
1186
   {
1187
      truelen = png_ptr->channels;
1188 1189
      sample_depth = png_ptr->bit_depth;
   }
G
Guy Schalnat 已提交
1190

1191
   if (length != truelen || length > 4)
G
Guy Schalnat 已提交
1192
   {
1193
      png_chunk_benign_error(png_ptr, "invalid");
A
Andreas Dilger 已提交
1194
      png_crc_finish(png_ptr, length);
G
Guy Schalnat 已提交
1195
      return;
G
Guy Schalnat 已提交
1196 1197
   }

1198
   buf[0] = buf[1] = buf[2] = buf[3] = sample_depth;
A
Andreas Dilger 已提交
1199
   png_crc_read(png_ptr, buf, truelen);
1200

1201
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
1202 1203
      return;

1204
   for (i=0; i<truelen; ++i)
1205
   {
1206 1207 1208 1209 1210
      if (buf[i] == 0 || buf[i] > sample_depth)
      {
         png_chunk_benign_error(png_ptr, "invalid");
         return;
      }
1211
   }
1212

1213
   if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
G
Guy Schalnat 已提交
1214
   {
G
Guy Schalnat 已提交
1215 1216 1217 1218
      png_ptr->sig_bit.red = buf[0];
      png_ptr->sig_bit.green = buf[1];
      png_ptr->sig_bit.blue = buf[2];
      png_ptr->sig_bit.alpha = buf[3];
G
Guy Schalnat 已提交
1219
   }
1220

G
Guy Schalnat 已提交
1221 1222
   else
   {
G
Guy Schalnat 已提交
1223
      png_ptr->sig_bit.gray = buf[0];
1224 1225 1226
      png_ptr->sig_bit.red = buf[0];
      png_ptr->sig_bit.green = buf[0];
      png_ptr->sig_bit.blue = buf[0];
G
Guy Schalnat 已提交
1227
      png_ptr->sig_bit.alpha = buf[1];
G
Guy Schalnat 已提交
1228
   }
1229

A
Andreas Dilger 已提交
1230
   png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit));
G
Guy Schalnat 已提交
1231
}
G
Guy Schalnat 已提交
1232
#endif
G
Guy Schalnat 已提交
1233

1234
#ifdef PNG_READ_cHRM_SUPPORTED
1235
void /* PRIVATE */
1236
png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
1237
{
1238
   png_byte buf[32];
1239
   png_xy xy;
1240

1241
   png_debug(1, "in png_handle_cHRM");
A
Andreas Dilger 已提交
1242

1243
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1244
      png_chunk_error(png_ptr, "missing IHDR");
1245

1246
   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
A
Andreas Dilger 已提交
1247 1248
   {
      png_crc_finish(png_ptr, length);
1249
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1250 1251
      return;
   }
G
Guy Schalnat 已提交
1252

G
Guy Schalnat 已提交
1253 1254
   if (length != 32)
   {
A
Andreas Dilger 已提交
1255
      png_crc_finish(png_ptr, length);
1256
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
1257
      return;
G
Guy Schalnat 已提交
1258 1259
   }

1260
   png_crc_read(png_ptr, buf, 32);
1261

1262
   if (png_crc_finish(png_ptr, 0) != 0)
1263
      return;
A
Andreas Dilger 已提交
1264

1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
   xy.whitex = png_get_fixed_point(NULL, buf);
   xy.whitey = png_get_fixed_point(NULL, buf + 4);
   xy.redx   = png_get_fixed_point(NULL, buf + 8);
   xy.redy   = png_get_fixed_point(NULL, buf + 12);
   xy.greenx = png_get_fixed_point(NULL, buf + 16);
   xy.greeny = png_get_fixed_point(NULL, buf + 20);
   xy.bluex  = png_get_fixed_point(NULL, buf + 24);
   xy.bluey  = png_get_fixed_point(NULL, buf + 28);

   if (xy.whitex == PNG_FIXED_ERROR ||
       xy.whitey == PNG_FIXED_ERROR ||
       xy.redx   == PNG_FIXED_ERROR ||
       xy.redy   == PNG_FIXED_ERROR ||
       xy.greenx == PNG_FIXED_ERROR ||
       xy.greeny == PNG_FIXED_ERROR ||
       xy.bluex  == PNG_FIXED_ERROR ||
       xy.bluey  == PNG_FIXED_ERROR)
   {
      png_chunk_benign_error(png_ptr, "invalid values");
1284 1285
      return;
   }
G
Guy Schalnat 已提交
1286

1287
   /* If a colorspace error has already been output skip this chunk */
1288
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
1289
      return;
1290

1291
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0)
1292
   {
1293 1294 1295 1296
      png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
      png_colorspace_sync(png_ptr, info_ptr);
      png_chunk_benign_error(png_ptr, "duplicate");
      return;
1297 1298
   }

1299 1300
   png_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
   (void)png_colorspace_set_chromaticities(png_ptr, &png_ptr->colorspace, &xy,
1301
       1/*prefer cHRM values*/);
1302
   png_colorspace_sync(png_ptr, info_ptr);
G
Guy Schalnat 已提交
1303
}
G
Guy Schalnat 已提交
1304
#endif
G
Guy Schalnat 已提交
1305

1306
#ifdef PNG_READ_sRGB_SUPPORTED
1307
void /* PRIVATE */
1308
png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
1309
{
1310
   png_byte intent;
1311

1312
   png_debug(1, "in png_handle_sRGB");
1313

1314
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1315
      png_chunk_error(png_ptr, "missing IHDR");
1316

1317
   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
1318 1319
   {
      png_crc_finish(png_ptr, length);
1320
      png_chunk_benign_error(png_ptr, "out of place");
1321 1322 1323 1324 1325 1326
      return;
   }

   if (length != 1)
   {
      png_crc_finish(png_ptr, length);
1327
      png_chunk_benign_error(png_ptr, "invalid");
1328 1329 1330
      return;
   }

1331
   png_crc_read(png_ptr, &intent, 1);
1332

1333
   if (png_crc_finish(png_ptr, 0) != 0)
1334 1335
      return;

1336
   /* If a colorspace error has already been output skip this chunk */
1337
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
1338
      return;
1339

1340 1341 1342
   /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect
    * this.
    */
1343
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) != 0)
1344
   {
1345 1346 1347 1348
      png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
      png_colorspace_sync(png_ptr, info_ptr);
      png_chunk_benign_error(png_ptr, "too many profiles");
      return;
1349 1350
   }

1351 1352
   (void)png_colorspace_set_sRGB(png_ptr, &png_ptr->colorspace, intent);
   png_colorspace_sync(png_ptr, info_ptr);
1353
}
1354
#endif /* READ_sRGB */
1355

1356
#ifdef PNG_READ_iCCP_SUPPORTED
1357
void /* PRIVATE */
1358
png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
1359
/* Note: this does not properly handle profiles that are > 64K under DOS */
1360
{
1361 1362
   png_const_charp errmsg = NULL; /* error message output, or no error */
   int finished = 0; /* crc checked */
1363

1364
   png_debug(1, "in png_handle_iCCP");
1365

1366
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1367
      png_chunk_error(png_ptr, "missing IHDR");
1368

1369
   else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
1370 1371
   {
      png_crc_finish(png_ptr, length);
1372
      png_chunk_benign_error(png_ptr, "out of place");
1373 1374
      return;
   }
1375

1376 1377 1378 1379
   /* Consistent with all the above colorspace handling an obviously *invalid*
    * chunk is just ignored, so does not invalidate the color space.  An
    * alternative is to set the 'invalid' flags at the start of this routine
    * and only clear them in they were not set before and all the tests pass.
1380 1381 1382
    * The minimum 'deflate' stream is assumed to be just the 2 byte header and
    * 4 byte checksum.  The keyword must be at least one character and there is
    * a terminator (0) byte and the compression method.
1383 1384
    */
   if (length < 9)
1385
   {
1386
      png_crc_finish(png_ptr, length);
1387
      png_chunk_benign_error(png_ptr, "too short");
1388
      return;
1389 1390
   }

1391
   /* If a colorspace error has already been output skip this chunk */
1392
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
1393
   {
1394 1395
      png_crc_finish(png_ptr, length);
      return;
1396
   }
1397

1398 1399 1400 1401
   /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect
    * this.
    */
   if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) == 0)
1402
   {
1403 1404
      uInt read_length, keyword_length;
      char keyword[81];
1405

1406 1407 1408 1409 1410 1411
      /* Find the keyword; the keyword plus separator and compression method
       * bytes can be at most 81 characters long.
       */
      read_length = 81; /* maximum */
      if (read_length > length)
         read_length = (uInt)length;
1412

1413 1414
      png_crc_read(png_ptr, (png_bytep)keyword, read_length);
      length -= read_length;
1415

1416 1417 1418 1419
      keyword_length = 0;
      while (keyword_length < 80 && keyword_length < read_length &&
         keyword[keyword_length] != 0)
         ++keyword_length;
1420

1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
      /* TODO: make the keyword checking common */
      if (keyword_length >= 1 && keyword_length <= 79)
      {
         /* We only understand '0' compression - deflate - so if we get a
          * different value we can't safely decode the chunk.
          */
         if (keyword_length+1 < read_length &&
            keyword[keyword_length+1] == PNG_COMPRESSION_TYPE_BASE)
         {
            read_length -= keyword_length+2;
1431

1432
            if (png_inflate_claim(png_ptr, png_iCCP) == Z_OK)
1433 1434 1435 1436
            {
               Byte profile_header[132];
               Byte local_buffer[PNG_INFLATE_BUF_SIZE];
               png_alloc_size_t size = (sizeof profile_header);
1437

1438 1439 1440
               png_ptr->zstream.next_in = (Bytef*)keyword + (keyword_length+2);
               png_ptr->zstream.avail_in = read_length;
               (void)png_inflate_read(png_ptr, local_buffer,
1441 1442
                   (sizeof local_buffer), &length, profile_header, &size,
                   0/*finish: don't, because the output is too small*/);
1443

1444 1445 1446 1447 1448 1449
               if (size == 0)
               {
                  /* We have the ICC profile header; do the basic header checks.
                   */
                  const png_uint_32 profile_length =
                     png_get_uint_32(profile_header);
1450

1451
                  if (png_icc_check_length(png_ptr, &png_ptr->colorspace,
1452
                      keyword, profile_length) != 0)
1453 1454 1455 1456 1457
                  {
                     /* The length is apparently ok, so we can check the 132
                      * byte header.
                      */
                     if (png_icc_check_header(png_ptr, &png_ptr->colorspace,
1458 1459
                         keyword, profile_length, profile_header,
                         png_ptr->color_type) != 0)
1460 1461 1462 1463 1464 1465 1466
                     {
                        /* Now read the tag table; a variable size buffer is
                         * needed at this point, allocate one for the whole
                         * profile.  The header check has already validated
                         * that none of these stuff will overflow.
                         */
                        const png_uint_32 tag_count = png_get_uint_32(
1467
                            profile_header+128);
1468
                        png_bytep profile = png_read_buffer(png_ptr,
1469
                            profile_length, 2/*silent*/);
1470 1471 1472 1473

                        if (profile != NULL)
                        {
                           memcpy(profile, profile_header,
1474
                               (sizeof profile_header));
1475 1476 1477 1478

                           size = 12 * tag_count;

                           (void)png_inflate_read(png_ptr, local_buffer,
1479 1480
                               (sizeof local_buffer), &length,
                               profile + (sizeof profile_header), &size, 0);
1481

1482
                           /* Still expect a buffer error because we expect
1483 1484 1485 1486 1487
                            * there to be some tag data!
                            */
                           if (size == 0)
                           {
                              if (png_icc_check_tag_table(png_ptr,
1488 1489
                                  &png_ptr->colorspace, keyword, profile_length,
                                  profile) != 0)
1490 1491 1492 1493 1494
                              {
                                 /* The profile has been validated for basic
                                  * security issues, so read the whole thing in.
                                  */
                                 size = profile_length - (sizeof profile_header)
1495
                                     - 12 * tag_count;
1496 1497

                                 (void)png_inflate_read(png_ptr, local_buffer,
1498 1499 1500
                                     (sizeof local_buffer), &length,
                                     profile + (sizeof profile_header) +
                                     12 * tag_count, &size, 1/*finish*/);
1501 1502

                                 if (length > 0 && !(png_ptr->flags &
1503
                                     PNG_FLAG_BENIGN_ERRORS_WARN))
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514
                                    errmsg = "extra compressed data";

                                 /* But otherwise allow extra data: */
                                 else if (size == 0)
                                 {
                                    if (length > 0)
                                    {
                                       /* This can be handled completely, so
                                        * keep going.
                                        */
                                       png_chunk_warning(png_ptr,
1515
                                           "extra compressed data");
1516 1517 1518 1519 1520
                                    }

                                    png_crc_finish(png_ptr, length);
                                    finished = 1;

1521
# if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
1522 1523
                                    /* Check for a match against sRGB */
                                    png_icc_set_sRGB(png_ptr,
1524 1525
                                        &png_ptr->colorspace, profile,
                                        png_ptr->zstream.adler);
1526
# endif
1527 1528 1529 1530 1531

                                    /* Steal the profile for info_ptr. */
                                    if (info_ptr != NULL)
                                    {
                                       png_free_data(png_ptr, info_ptr,
1532
                                           PNG_FREE_ICCP, 0);
1533 1534

                                       info_ptr->iccp_name = png_voidcast(char*,
1535 1536
                                           png_malloc_base(png_ptr,
                                           keyword_length+1));
1537 1538 1539
                                       if (info_ptr->iccp_name != NULL)
                                       {
                                          memcpy(info_ptr->iccp_name, keyword,
1540
                                              keyword_length+1);
1541
                                          info_ptr->iccp_proflen =
1542
                                              profile_length;
1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
                                          info_ptr->iccp_profile = profile;
                                          png_ptr->read_buffer = NULL; /*steal*/
                                          info_ptr->free_me |= PNG_FREE_ICCP;
                                          info_ptr->valid |= PNG_INFO_iCCP;
                                       }

                                       else
                                       {
                                          png_ptr->colorspace.flags |=
                                             PNG_COLORSPACE_INVALID;
                                          errmsg = "out of memory";
                                       }
                                    }

                                    /* else the profile remains in the read
                                     * buffer which gets reused for subsequent
                                     * chunks.
                                     */

                                    if (info_ptr != NULL)
                                       png_colorspace_sync(png_ptr, info_ptr);

                                    if (errmsg == NULL)
                                    {
                                       png_ptr->zowner = 0;
                                       return;
                                    }
                                 }

                                 else if (size > 0)
                                    errmsg = "truncated";

1575
#ifndef __COVERITY__
1576 1577
                                 else
                                    errmsg = png_ptr->zstream.msg;
1578
#endif
1579 1580 1581 1582 1583 1584 1585 1586
                              }

                              /* else png_icc_check_tag_table output an error */
                           }

                           else /* profile truncated */
                              errmsg = png_ptr->zstream.msg;
                        }
1587

1588 1589 1590
                        else
                           errmsg = "out of memory";
                     }
1591

1592 1593
                     /* else png_icc_check_header output an error */
                  }
1594

1595 1596
                  /* else png_icc_check_length output an error */
               }
1597

1598 1599
               else /* profile truncated */
                  errmsg = png_ptr->zstream.msg;
1600

1601 1602 1603
               /* Release the stream */
               png_ptr->zowner = 0;
            }
1604

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
            else /* png_inflate_claim failed */
               errmsg = png_ptr->zstream.msg;
         }

         else
            errmsg = "bad compression method"; /* or missing */
      }

      else
         errmsg = "bad keyword";
1615
   }
1616

1617 1618 1619 1620
   else
      errmsg = "too many profiles";

   /* Failure: the reason is in 'errmsg' */
1621
   if (finished == 0)
1622 1623 1624 1625 1626 1627
      png_crc_finish(png_ptr, length);

   png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
   png_colorspace_sync(png_ptr, info_ptr);
   if (errmsg != NULL) /* else already output */
      png_chunk_benign_error(png_ptr, errmsg);
1628
}
1629
#endif /* READ_iCCP */
1630

1631
#ifdef PNG_READ_sPLT_SUPPORTED
1632
void /* PRIVATE */
1633
png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
1634 1635
/* Note: this does not properly handle chunks that are > 64K under DOS */
{
1636
   png_bytep entry_start, buffer;
1637
   png_sPLT_t new_palette;
1638
   png_sPLT_entryp pp;
1639 1640
   png_uint_32 data_length;
   int entry_size, i;
1641
   png_uint_32 skip = 0;
1642 1643
   png_uint_32 dl;
   png_size_t max_dl;
1644

1645
   png_debug(1, "in png_handle_sPLT");
1646

1647
#ifdef PNG_USER_LIMITS_SUPPORTED
1648 1649 1650 1651 1652 1653 1654
   if (png_ptr->user_chunk_cache_max != 0)
   {
      if (png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
         return;
      }
1655

1656 1657 1658 1659 1660 1661 1662 1663 1664
      if (--png_ptr->user_chunk_cache_max == 1)
      {
         png_warning(png_ptr, "No space in chunk cache for sPLT");
         png_crc_finish(png_ptr, length);
         return;
      }
   }
#endif

1665
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1666
      png_chunk_error(png_ptr, "missing IHDR");
1667

1668
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
1669 1670
   {
      png_crc_finish(png_ptr, length);
1671
      png_chunk_benign_error(png_ptr, "out of place");
1672 1673 1674 1675
      return;
   }

#ifdef PNG_MAX_MALLOC_64K
1676
   if (length > 65535U)
1677
   {
1678 1679 1680
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "too large to fit in memory");
      return;
1681 1682 1683
   }
#endif

1684 1685 1686 1687 1688 1689 1690 1691
   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
   if (buffer == NULL)
   {
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "out of memory");
      return;
   }

1692 1693 1694 1695 1696

   /* WARNING: this may break if size_t is less than 32 bits; it is assumed
    * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a
    * potential breakage point if the types in pngconf.h aren't exactly right.
    */
1697
   png_crc_read(png_ptr, buffer, length);
1698

1699
   if (png_crc_finish(png_ptr, skip) != 0)
1700 1701
      return;

1702
   buffer[length] = 0;
1703

1704
   for (entry_start = buffer; *entry_start; entry_start++)
1705
      /* Empty loop to find end of name */ ;
1706

1707 1708
   ++entry_start;

1709
   /* A sample depth should follow the separator, and we should be on it  */
1710
   if (length < 2U || entry_start > buffer + (length - 2U))
1711
   {
1712 1713
      png_warning(png_ptr, "malformed sPLT chunk");
      return;
1714 1715 1716
   }

   new_palette.depth = *entry_start++;
1717
   entry_size = (new_palette.depth == 8 ? 6 : 10);
1718
   /* This must fit in a png_uint_32 because it is derived from the original
1719
    * chunk data length.
1720
    */
1721
   data_length = length - (png_uint_32)(entry_start - buffer);
1722

1723
   /* Integrity-check the data length */
1724
   if ((data_length % (unsigned int)entry_size) != 0)
1725
   {
1726 1727
      png_warning(png_ptr, "sPLT chunk has bad length");
      return;
1728 1729
   }

1730
   dl = (png_uint_32)(data_length / (unsigned int)entry_size);
1731
   max_dl = PNG_SIZE_MAX / (sizeof (png_sPLT_entry));
1732 1733

   if (dl > max_dl)
1734
   {
1735 1736
      png_warning(png_ptr, "sPLT chunk too long");
      return;
1737
   }
1738

1739
   new_palette.nentries = (png_int_32)(data_length / (unsigned int)entry_size);
1740

1741 1742
   new_palette.entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
       (png_alloc_size_t) new_palette.nentries * (sizeof (png_sPLT_entry)));
1743

1744 1745
   if (new_palette.entries == NULL)
   {
1746 1747
      png_warning(png_ptr, "sPLT chunk requires too much memory");
      return;
1748
   }
1749

1750
#ifdef PNG_POINTER_INDEXING_SUPPORTED
1751 1752
   for (i = 0; i < new_palette.nentries; i++)
   {
1753
      pp = new_palette.entries + i;
1754 1755 1756

      if (new_palette.depth == 8)
      {
1757 1758 1759 1760
         pp->red = *entry_start++;
         pp->green = *entry_start++;
         pp->blue = *entry_start++;
         pp->alpha = *entry_start++;
1761
      }
1762

1763 1764
      else
      {
1765 1766 1767 1768
         pp->red   = png_get_uint_16(entry_start); entry_start += 2;
         pp->green = png_get_uint_16(entry_start); entry_start += 2;
         pp->blue  = png_get_uint_16(entry_start); entry_start += 2;
         pp->alpha = png_get_uint_16(entry_start); entry_start += 2;
1769
      }
1770

1771 1772
      pp->frequency = png_get_uint_16(entry_start); entry_start += 2;
   }
1773 1774
#else
   pp = new_palette.entries;
1775

1776 1777 1778 1779 1780
   for (i = 0; i < new_palette.nentries; i++)
   {

      if (new_palette.depth == 8)
      {
1781 1782 1783 1784
         pp[i].red   = *entry_start++;
         pp[i].green = *entry_start++;
         pp[i].blue  = *entry_start++;
         pp[i].alpha = *entry_start++;
1785
      }
1786

1787 1788
      else
      {
1789 1790 1791 1792
         pp[i].red   = png_get_uint_16(entry_start); entry_start += 2;
         pp[i].green = png_get_uint_16(entry_start); entry_start += 2;
         pp[i].blue  = png_get_uint_16(entry_start); entry_start += 2;
         pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2;
1793
      }
1794

1795
      pp[i].frequency = png_get_uint_16(entry_start); entry_start += 2;
1796 1797
   }
#endif
1798

1799
   /* Discard all chunk data except the name and stash that */
1800
   new_palette.name = (png_charp)buffer;
1801

1802
   png_set_sPLT(png_ptr, info_ptr, &new_palette, 1);
1803 1804 1805

   png_free(png_ptr, new_palette.entries);
}
1806
#endif /* READ_sPLT */
1807

1808
#ifdef PNG_READ_tRNS_SUPPORTED
1809
void /* PRIVATE */
1810
png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
1811
{
1812
   png_byte readbuf[PNG_MAX_PALETTE_LENGTH];
1813

1814
   png_debug(1, "in png_handle_tRNS");
A
Andreas Dilger 已提交
1815

1816
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1817
      png_chunk_error(png_ptr, "missing IHDR");
1818

1819
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
1820 1821
   {
      png_crc_finish(png_ptr, length);
1822
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1823 1824
      return;
   }
1825

1826
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)
A
Andreas Dilger 已提交
1827 1828
   {
      png_crc_finish(png_ptr, length);
1829
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
1830 1831
      return;
   }
G
Guy Schalnat 已提交
1832

1833
   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
G
Guy Schalnat 已提交
1834
   {
1835 1836 1837
      png_byte buf[2];

      if (length != 2)
G
Guy Schalnat 已提交
1838
      {
A
Andreas Dilger 已提交
1839
         png_crc_finish(png_ptr, length);
1840
         png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
1841 1842 1843
         return;
      }

1844 1845
      png_crc_read(png_ptr, buf, 2);
      png_ptr->num_trans = 1;
1846
      png_ptr->trans_color.gray = png_get_uint_16(buf);
G
Guy Schalnat 已提交
1847
   }
1848

G
Guy Schalnat 已提交
1849 1850 1851 1852 1853 1854
   else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
   {
      png_byte buf[6];

      if (length != 6)
      {
A
Andreas Dilger 已提交
1855
         png_crc_finish(png_ptr, length);
1856
         png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
1857 1858
         return;
      }
1859

1860
      png_crc_read(png_ptr, buf, length);
1861
      png_ptr->num_trans = 1;
1862 1863 1864
      png_ptr->trans_color.red = png_get_uint_16(buf);
      png_ptr->trans_color.green = png_get_uint_16(buf + 2);
      png_ptr->trans_color.blue = png_get_uint_16(buf + 4);
G
Guy Schalnat 已提交
1865
   }
1866

1867
   else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
G
Guy Schalnat 已提交
1868
   {
1869
      if ((png_ptr->mode & PNG_HAVE_PLTE) == 0)
1870
      {
1871
         /* TODO: is this actually an error in the ISO spec? */
A
Andreas Dilger 已提交
1872
         png_crc_finish(png_ptr, length);
1873
         png_chunk_benign_error(png_ptr, "out of place");
G
Guy Schalnat 已提交
1874 1875
         return;
      }
1876

1877
      if (length > (unsigned int) png_ptr->num_palette ||
1878
         length > (unsigned int) PNG_MAX_PALETTE_LENGTH ||
1879
         length == 0)
1880 1881
      {
         png_crc_finish(png_ptr, length);
1882
         png_chunk_benign_error(png_ptr, "invalid");
1883 1884
         return;
      }
1885

1886
      png_crc_read(png_ptr, readbuf, length);
1887
      png_ptr->num_trans = (png_uint_16)length;
G
Guy Schalnat 已提交
1888
   }
1889

G
Guy Schalnat 已提交
1890
   else
G
Guy Schalnat 已提交
1891
   {
A
Andreas Dilger 已提交
1892
      png_crc_finish(png_ptr, length);
1893
      png_chunk_benign_error(png_ptr, "invalid with alpha channel");
G
Guy Schalnat 已提交
1894 1895
      return;
   }
G
Guy Schalnat 已提交
1896

1897
   if (png_crc_finish(png_ptr, 0) != 0)
1898 1899
   {
      png_ptr->num_trans = 0;
A
Andreas Dilger 已提交
1900
      return;
1901
   }
A
Andreas Dilger 已提交
1902

1903 1904 1905 1906
   /* TODO: this is a horrible side effect in the palette case because the
    * png_struct ends up with a pointer to the tRNS buffer owned by the
    * png_info.  Fix this.
    */
1907
   png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans,
1908
       &(png_ptr->trans_color));
G
Guy Schalnat 已提交
1909
}
G
Guy Schalnat 已提交
1910
#endif
G
Guy Schalnat 已提交
1911

1912
#ifdef PNG_READ_bKGD_SUPPORTED
1913
void /* PRIVATE */
1914
png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
1915
{
1916
   unsigned int truelen;
G
Guy Schalnat 已提交
1917
   png_byte buf[6];
1918
   png_color_16 background;
G
Guy Schalnat 已提交
1919

1920
   png_debug(1, "in png_handle_bKGD");
A
Andreas Dilger 已提交
1921

1922
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
1923
      png_chunk_error(png_ptr, "missing IHDR");
1924

1925 1926 1927
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||
       (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
       (png_ptr->mode & PNG_HAVE_PLTE) == 0))
G
Guy Schalnat 已提交
1928
   {
A
Andreas Dilger 已提交
1929
      png_crc_finish(png_ptr, length);
1930
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
1931 1932
      return;
   }
1933

1934
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)
A
Andreas Dilger 已提交
1935 1936
   {
      png_crc_finish(png_ptr, length);
1937
      png_chunk_benign_error(png_ptr, "duplicate");
G
Guy Schalnat 已提交
1938 1939 1940
      return;
   }

G
Guy Schalnat 已提交
1941 1942
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
      truelen = 1;
1943

1944
   else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
G
Guy Schalnat 已提交
1945
      truelen = 6;
1946

G
Guy Schalnat 已提交
1947 1948 1949
   else
      truelen = 2;

A
Andreas Dilger 已提交
1950
   if (length != truelen)
G
Guy Schalnat 已提交
1951
   {
A
Andreas Dilger 已提交
1952
      png_crc_finish(png_ptr, length);
1953
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
1954 1955 1956
      return;
   }

A
Andreas Dilger 已提交
1957
   png_crc_read(png_ptr, buf, truelen);
1958

1959
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
1960 1961
      return;

G
Guy Schalnat 已提交
1962 1963 1964
   /* We convert the index value into RGB components so that we can allow
    * arbitrary RGB values for background when we have transparency, and
    * so it is easy to determine the RGB values of the background color
1965 1966
    * from the info_ptr struct.
    */
G
Guy Schalnat 已提交
1967
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
G
Guy Schalnat 已提交
1968
   {
1969
      background.index = buf[0];
1970

1971
      if (info_ptr != NULL && info_ptr->num_palette != 0)
1972
      {
1973 1974
         if (buf[0] >= info_ptr->num_palette)
         {
1975
            png_chunk_benign_error(png_ptr, "invalid index");
1976 1977 1978
            return;
         }

1979 1980 1981 1982
         background.red = (png_uint_16)png_ptr->palette[buf[0]].red;
         background.green = (png_uint_16)png_ptr->palette[buf[0]].green;
         background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue;
      }
1983

1984 1985
      else
         background.red = background.green = background.blue = 0;
1986

1987
      background.gray = 0;
G
Guy Schalnat 已提交
1988
   }
1989

1990
   else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* GRAY */
G
Guy Schalnat 已提交
1991
   {
1992 1993 1994 1995 1996
      background.index = 0;
      background.red =
      background.green =
      background.blue =
      background.gray = png_get_uint_16(buf);
G
Guy Schalnat 已提交
1997
   }
1998

G
Guy Schalnat 已提交
1999 2000
   else
   {
2001 2002 2003 2004 2005
      background.index = 0;
      background.red = png_get_uint_16(buf);
      background.green = png_get_uint_16(buf + 2);
      background.blue = png_get_uint_16(buf + 4);
      background.gray = 0;
G
Guy Schalnat 已提交
2006 2007
   }

2008
   png_set_bKGD(png_ptr, info_ptr, &background);
G
Guy Schalnat 已提交
2009
}
G
Guy Schalnat 已提交
2010
#endif
G
Guy Schalnat 已提交
2011

2012
#ifdef PNG_READ_hIST_SUPPORTED
2013
void /* PRIVATE */
2014
png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2015
{
2016
   unsigned int num, i;
2017
   png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];
G
Guy Schalnat 已提交
2018

2019
   png_debug(1, "in png_handle_hIST");
A
Andreas Dilger 已提交
2020

2021
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2022
      png_chunk_error(png_ptr, "missing IHDR");
2023

2024 2025
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||
       (png_ptr->mode & PNG_HAVE_PLTE) == 0)
G
Guy Schalnat 已提交
2026
   {
A
Andreas Dilger 已提交
2027
      png_crc_finish(png_ptr, length);
2028
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
2029 2030
      return;
   }
2031

2032
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)
A
Andreas Dilger 已提交
2033 2034
   {
      png_crc_finish(png_ptr, length);
2035
      png_chunk_benign_error(png_ptr, "duplicate");
G
Guy Schalnat 已提交
2036 2037 2038
      return;
   }

2039
   num = length / 2 ;
2040

2041 2042
   if (num != (unsigned int) png_ptr->num_palette ||
       num > (unsigned int) PNG_MAX_PALETTE_LENGTH)
G
Guy Schalnat 已提交
2043
   {
A
Andreas Dilger 已提交
2044
      png_crc_finish(png_ptr, length);
2045
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
2046 2047
      return;
   }
G
Guy Schalnat 已提交
2048

G
Guy Schalnat 已提交
2049
   for (i = 0; i < num; i++)
G
Guy Schalnat 已提交
2050 2051 2052 2053
   {
      png_byte buf[2];

      png_crc_read(png_ptr, buf, 2);
2054
      readbuf[i] = png_get_uint_16(buf);
G
Guy Schalnat 已提交
2055
   }
A
Andreas Dilger 已提交
2056

2057
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
2058 2059
      return;

2060
   png_set_hIST(png_ptr, info_ptr, readbuf);
G
Guy Schalnat 已提交
2061
}
G
Guy Schalnat 已提交
2062
#endif
G
Guy Schalnat 已提交
2063

2064
#ifdef PNG_READ_pHYs_SUPPORTED
2065
void /* PRIVATE */
2066
png_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2067 2068 2069 2070 2071
{
   png_byte buf[9];
   png_uint_32 res_x, res_y;
   int unit_type;

2072
   png_debug(1, "in png_handle_pHYs");
A
Andreas Dilger 已提交
2073

2074
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2075
      png_chunk_error(png_ptr, "missing IHDR");
2076

2077
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2078 2079
   {
      png_crc_finish(png_ptr, length);
2080
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
2081 2082
      return;
   }
2083

2084
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) != 0)
A
Andreas Dilger 已提交
2085 2086
   {
      png_crc_finish(png_ptr, length);
2087
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
2088 2089
      return;
   }
G
Guy Schalnat 已提交
2090

G
Guy Schalnat 已提交
2091 2092
   if (length != 9)
   {
A
Andreas Dilger 已提交
2093
      png_crc_finish(png_ptr, length);
2094
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
2095
      return;
G
Guy Schalnat 已提交
2096
   }
G
Guy Schalnat 已提交
2097 2098

   png_crc_read(png_ptr, buf, 9);
2099

2100
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
2101
      return;
G
Guy Schalnat 已提交
2102 2103 2104 2105

   res_x = png_get_uint_32(buf);
   res_y = png_get_uint_32(buf + 4);
   unit_type = buf[8];
A
Andreas Dilger 已提交
2106
   png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type);
G
Guy Schalnat 已提交
2107
}
G
Guy Schalnat 已提交
2108
#endif
G
Guy Schalnat 已提交
2109

2110
#ifdef PNG_READ_oFFs_SUPPORTED
2111
void /* PRIVATE */
2112
png_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2113 2114
{
   png_byte buf[9];
2115
   png_int_32 offset_x, offset_y;
G
Guy Schalnat 已提交
2116 2117
   int unit_type;

2118
   png_debug(1, "in png_handle_oFFs");
A
Andreas Dilger 已提交
2119

2120
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2121
      png_chunk_error(png_ptr, "missing IHDR");
2122

2123
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2124 2125
   {
      png_crc_finish(png_ptr, length);
2126
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
2127 2128
      return;
   }
2129

2130
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) != 0)
A
Andreas Dilger 已提交
2131 2132
   {
      png_crc_finish(png_ptr, length);
2133
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
2134 2135
      return;
   }
G
Guy Schalnat 已提交
2136

G
Guy Schalnat 已提交
2137 2138
   if (length != 9)
   {
A
Andreas Dilger 已提交
2139
      png_crc_finish(png_ptr, length);
2140
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
2141 2142 2143
      return;
   }

G
Guy Schalnat 已提交
2144
   png_crc_read(png_ptr, buf, 9);
2145

2146
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
2147
      return;
G
Guy Schalnat 已提交
2148

2149 2150
   offset_x = png_get_int_32(buf);
   offset_y = png_get_int_32(buf + 4);
G
Guy Schalnat 已提交
2151
   unit_type = buf[8];
A
Andreas Dilger 已提交
2152 2153 2154 2155
   png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);
}
#endif

2156
#ifdef PNG_READ_pCAL_SUPPORTED
2157
/* Read the pCAL chunk (described in the PNG Extensions document) */
2158
void /* PRIVATE */
2159
png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
A
Andreas Dilger 已提交
2160 2161 2162
{
   png_int_32 X0, X1;
   png_byte type, nparams;
2163
   png_bytep buffer, buf, units, endptr;
A
Andreas Dilger 已提交
2164 2165 2166
   png_charpp params;
   int i;

2167
   png_debug(1, "in png_handle_pCAL");
A
Andreas Dilger 已提交
2168

2169
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2170
      png_chunk_error(png_ptr, "missing IHDR");
2171

2172
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2173 2174
   {
      png_crc_finish(png_ptr, length);
2175
      png_chunk_benign_error(png_ptr, "out of place");
A
Andreas Dilger 已提交
2176 2177
      return;
   }
2178

2179
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) != 0)
A
Andreas Dilger 已提交
2180 2181
   {
      png_crc_finish(png_ptr, length);
2182
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
2183 2184 2185
      return;
   }

2186 2187 2188
   png_debug1(2, "Allocating and reading pCAL chunk data (%u bytes)",
       length + 1);

2189 2190 2191
   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);

   if (buffer == NULL)
2192
   {
2193 2194
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "out of memory");
2195 2196 2197
      return;
   }

2198
   png_crc_read(png_ptr, buffer, length);
A
Andreas Dilger 已提交
2199

2200
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
2201 2202
      return;

2203
   buffer[length] = 0; /* Null terminate the last string */
A
Andreas Dilger 已提交
2204

2205
   png_debug(3, "Finding end of pCAL purpose string");
2206
   for (buf = buffer; *buf; buf++)
2207
      /* Empty loop */ ;
A
Andreas Dilger 已提交
2208

2209
   endptr = buffer + length;
A
Andreas Dilger 已提交
2210 2211

   /* We need to have at least 12 bytes after the purpose string
2212 2213
    * in order to get the parameter information.
    */
2214
   if (endptr - buf <= 12)
A
Andreas Dilger 已提交
2215
   {
2216
      png_chunk_benign_error(png_ptr, "invalid");
A
Andreas Dilger 已提交
2217 2218 2219
      return;
   }

2220
   png_debug(3, "Reading pCAL X0, X1, type, nparams, and units");
A
Andreas Dilger 已提交
2221 2222 2223 2224 2225 2226
   X0 = png_get_int_32((png_bytep)buf+1);
   X1 = png_get_int_32((png_bytep)buf+5);
   type = buf[9];
   nparams = buf[10];
   units = buf + 11;

2227
   png_debug(3, "Checking pCAL equation type and number of parameters");
A
Andreas Dilger 已提交
2228
   /* Check that we have the right number of parameters for known
2229 2230
    * equation types.
    */
A
Andreas Dilger 已提交
2231 2232 2233 2234 2235
   if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||
       (type == PNG_EQUATION_BASE_E && nparams != 3) ||
       (type == PNG_EQUATION_ARBITRARY && nparams != 3) ||
       (type == PNG_EQUATION_HYPERBOLIC && nparams != 4))
   {
2236
      png_chunk_benign_error(png_ptr, "invalid parameter count");
A
Andreas Dilger 已提交
2237 2238
      return;
   }
2239

A
Andreas Dilger 已提交
2240 2241
   else if (type >= PNG_EQUATION_LAST)
   {
2242
      png_chunk_benign_error(png_ptr, "unrecognized equation type");
A
Andreas Dilger 已提交
2243 2244
   }

2245
   for (buf = units; *buf; buf++)
2246
      /* Empty loop to move past the units string. */ ;
A
Andreas Dilger 已提交
2247

2248
   png_debug(3, "Allocating pCAL parameters array");
2249

2250 2251
   params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
       nparams * (sizeof (png_charp))));
2252

2253
   if (params == NULL)
2254
   {
2255
      png_chunk_benign_error(png_ptr, "out of memory");
2256 2257
      return;
   }
A
Andreas Dilger 已提交
2258 2259

   /* Get pointers to the start of each parameter string. */
2260
   for (i = 0; i < nparams; i++)
A
Andreas Dilger 已提交
2261 2262 2263
   {
      buf++; /* Skip the null string terminator from previous parameter. */

2264
      png_debug1(3, "Reading pCAL parameter %d", i);
2265

2266
      for (params[i] = (png_charp)buf; buf <= endptr && *buf != 0; buf++)
2267
         /* Empty loop to move past each parameter string */ ;
A
Andreas Dilger 已提交
2268 2269 2270 2271 2272

      /* Make sure we haven't run out of data yet */
      if (buf > endptr)
      {
         png_free(png_ptr, params);
2273
         png_chunk_benign_error(png_ptr, "invalid data");
A
Andreas Dilger 已提交
2274 2275 2276 2277
         return;
      }
   }

2278
   png_set_pCAL(png_ptr, info_ptr, (png_charp)buffer, X0, X1, type, nparams,
2279
       (png_charp)units, params);
A
Andreas Dilger 已提交
2280 2281

   png_free(png_ptr, params);
G
Guy Schalnat 已提交
2282
}
G
Guy Schalnat 已提交
2283
#endif
G
Guy Schalnat 已提交
2284

2285
#ifdef PNG_READ_sCAL_SUPPORTED
2286
/* Read the sCAL chunk */
2287
void /* PRIVATE */
2288
png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
2289
{
2290 2291
   png_bytep buffer;
   png_size_t i;
2292
   int state;
2293

2294
   png_debug(1, "in png_handle_sCAL");
2295

2296
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2297
      png_chunk_error(png_ptr, "missing IHDR");
2298

2299
   else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
2300 2301
   {
      png_crc_finish(png_ptr, length);
2302
      png_chunk_benign_error(png_ptr, "out of place");
2303 2304
      return;
   }
2305

2306
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL) != 0)
2307 2308
   {
      png_crc_finish(png_ptr, length);
2309
      png_chunk_benign_error(png_ptr, "duplicate");
2310 2311 2312
      return;
   }

2313 2314 2315 2316
   /* Need unit type, width, \0, height: minimum 4 bytes */
   else if (length < 4)
   {
      png_crc_finish(png_ptr, length);
2317
      png_chunk_benign_error(png_ptr, "invalid");
2318 2319 2320
      return;
   }

2321
   png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)",
2322
       length + 1);
2323

2324
   buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
2325

2326
   if (buffer == NULL)
2327
   {
2328
      png_chunk_benign_error(png_ptr, "out of memory");
2329
      png_crc_finish(png_ptr, length);
2330 2331
      return;
   }
2332

2333 2334
   png_crc_read(png_ptr, buffer, length);
   buffer[length] = 0; /* Null terminate the last string */
2335

2336
   if (png_crc_finish(png_ptr, 0) != 0)
2337
      return;
2338

2339
   /* Validate the unit. */
2340
   if (buffer[0] != 1 && buffer[0] != 2)
2341
   {
2342
      png_chunk_benign_error(png_ptr, "invalid unit");
2343 2344
      return;
   }
2345

2346 2347 2348
   /* Validate the ASCII numbers, need two ASCII numbers separated by
    * a '\0' and they need to fit exactly in the chunk data.
    */
2349
   i = 1;
2350
   state = 0;
2351

2352
   if (png_check_fp_number((png_const_charp)buffer, length, &state, &i) == 0 ||
2353 2354
       i >= length || buffer[i++] != 0)
      png_chunk_benign_error(png_ptr, "bad width format");
2355

2356
   else if (PNG_FP_IS_POSITIVE(state) == 0)
2357
      png_chunk_benign_error(png_ptr, "non-positive width");
2358

2359
   else
2360
   {
2361
      png_size_t heighti = i;
2362

2363
      state = 0;
2364 2365
      if (png_check_fp_number((png_const_charp)buffer, length,
          &state, &i) == 0 || i != length)
2366
         png_chunk_benign_error(png_ptr, "bad height format");
2367

2368
      else if (PNG_FP_IS_POSITIVE(state) == 0)
2369
         png_chunk_benign_error(png_ptr, "non-positive height");
2370

2371 2372
      else
         /* This is the (only) success case. */
2373
         png_set_sCAL_s(png_ptr, info_ptr, buffer[0],
2374
             (png_charp)buffer+1, (png_charp)buffer+heighti);
2375
   }
2376 2377 2378
}
#endif

2379
#ifdef PNG_READ_tIME_SUPPORTED
2380
void /* PRIVATE */
2381
png_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2382 2383 2384 2385
{
   png_byte buf[7];
   png_time mod_time;

2386
   png_debug(1, "in png_handle_tIME");
A
Andreas Dilger 已提交
2387

2388
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2389
      png_chunk_error(png_ptr, "missing IHDR");
2390

2391
   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) != 0)
A
Andreas Dilger 已提交
2392 2393
   {
      png_crc_finish(png_ptr, length);
2394
      png_chunk_benign_error(png_ptr, "duplicate");
A
Andreas Dilger 已提交
2395 2396 2397
      return;
   }

2398
   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2399
      png_ptr->mode |= PNG_AFTER_IDAT;
G
Guy Schalnat 已提交
2400

G
Guy Schalnat 已提交
2401 2402
   if (length != 7)
   {
A
Andreas Dilger 已提交
2403
      png_crc_finish(png_ptr, length);
2404
      png_chunk_benign_error(png_ptr, "invalid");
G
Guy Schalnat 已提交
2405 2406 2407 2408
      return;
   }

   png_crc_read(png_ptr, buf, 7);
2409

2410
   if (png_crc_finish(png_ptr, 0) != 0)
A
Andreas Dilger 已提交
2411
      return;
G
Guy Schalnat 已提交
2412 2413 2414 2415 2416 2417

   mod_time.second = buf[6];
   mod_time.minute = buf[5];
   mod_time.hour = buf[4];
   mod_time.day = buf[3];
   mod_time.month = buf[2];
G
Guy Schalnat 已提交
2418
   mod_time.year = png_get_uint_16(buf);
G
Guy Schalnat 已提交
2419

A
Andreas Dilger 已提交
2420
   png_set_tIME(png_ptr, info_ptr, &mod_time);
G
Guy Schalnat 已提交
2421
}
G
Guy Schalnat 已提交
2422
#endif
G
Guy Schalnat 已提交
2423

2424
#ifdef PNG_READ_tEXt_SUPPORTED
A
Andreas Dilger 已提交
2425
/* Note: this does not properly handle chunks that are > 64K under DOS */
2426
void /* PRIVATE */
2427
png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2428
{
2429 2430
   png_text  text_info;
   png_bytep buffer;
G
Guy Schalnat 已提交
2431
   png_charp key;
G
Guy Schalnat 已提交
2432
   png_charp text;
A
Andreas Dilger 已提交
2433 2434
   png_uint_32 skip = 0;

2435
   png_debug(1, "in png_handle_tEXt");
G
Guy Schalnat 已提交
2436

2437
#ifdef PNG_USER_LIMITS_SUPPORTED
2438 2439 2440 2441 2442 2443 2444
   if (png_ptr->user_chunk_cache_max != 0)
   {
      if (png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
         return;
      }
2445

2446 2447 2448
      if (--png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
2449
         png_chunk_benign_error(png_ptr, "no space in chunk cache");
2450 2451 2452 2453 2454
         return;
      }
   }
#endif

2455
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2456
      png_chunk_error(png_ptr, "missing IHDR");
G
Guy Schalnat 已提交
2457

2458
   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2459 2460
      png_ptr->mode |= PNG_AFTER_IDAT;

A
Andreas Dilger 已提交
2461
#ifdef PNG_MAX_MALLOC_64K
2462
   if (length > 65535U)
A
Andreas Dilger 已提交
2463
   {
2464 2465 2466
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "too large to fit in memory");
      return;
A
Andreas Dilger 已提交
2467 2468 2469
   }
#endif

2470
   buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);
2471

2472
   if (buffer == NULL)
2473
   {
2474 2475
      png_chunk_benign_error(png_ptr, "out of memory");
      return;
2476
   }
2477

2478
   png_crc_read(png_ptr, buffer, length);
A
Andreas Dilger 已提交
2479

2480
   if (png_crc_finish(png_ptr, skip) != 0)
A
Andreas Dilger 已提交
2481
      return;
2482

2483 2484
   key = (png_charp)buffer;
   key[length] = 0;
G
Guy Schalnat 已提交
2485 2486

   for (text = key; *text; text++)
2487
      /* Empty loop to find end of key */ ;
G
Guy Schalnat 已提交
2488

2489
   if (text != key + length)
G
Guy Schalnat 已提交
2490 2491
      text++;

2492 2493 2494 2495 2496 2497 2498
   text_info.compression = PNG_TEXT_COMPRESSION_NONE;
   text_info.key = key;
   text_info.lang = NULL;
   text_info.lang_key = NULL;
   text_info.itxt_length = 0;
   text_info.text = text;
   text_info.text_length = strlen(text);
2499

2500
   if (png_set_text_2(png_ptr, info_ptr, &text_info, 1) != 0)
2501
      png_warning(png_ptr, "Insufficient memory to process text chunk");
G
Guy Schalnat 已提交
2502
}
G
Guy Schalnat 已提交
2503
#endif
G
Guy Schalnat 已提交
2504

2505
#ifdef PNG_READ_zTXt_SUPPORTED
2506
/* Note: this does not correctly handle chunks that are > 64K under DOS */
2507
void /* PRIVATE */
2508
png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
G
Guy Schalnat 已提交
2509
{
2510 2511 2512
   png_const_charp errmsg = NULL;
   png_bytep       buffer;
   png_uint_32     keyword_length;
A
Andreas Dilger 已提交
2513

2514
   png_debug(1, "in png_handle_zTXt");
2515

2516
#ifdef PNG_USER_LIMITS_SUPPORTED
2517 2518 2519 2520 2521 2522 2523
   if (png_ptr->user_chunk_cache_max != 0)
   {
      if (png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
         return;
      }
2524

2525 2526 2527
      if (--png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
2528
         png_chunk_benign_error(png_ptr, "no space in chunk cache");
2529 2530 2531 2532 2533
         return;
      }
   }
#endif

2534
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2535
      png_chunk_error(png_ptr, "missing IHDR");
G
Guy Schalnat 已提交
2536

2537
   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
A
Andreas Dilger 已提交
2538 2539
      png_ptr->mode |= PNG_AFTER_IDAT;

2540
   buffer = png_read_buffer(png_ptr, length, 2/*silent*/);
2541

2542
   if (buffer == NULL)
2543
   {
2544 2545
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "out of memory");
A
Andreas Dilger 已提交
2546
      return;
2547
   }
A
Andreas Dilger 已提交
2548

2549
   png_crc_read(png_ptr, buffer, length);
G
Guy Schalnat 已提交
2550

2551
   if (png_crc_finish(png_ptr, 0) != 0)
2552
      return;
G
Guy Schalnat 已提交
2553

2554 2555 2556 2557 2558
   /* TODO: also check that the keyword contents match the spec! */
   for (keyword_length = 0;
      keyword_length < length && buffer[keyword_length] != 0;
      ++keyword_length)
      /* Empty loop to find end of name */ ;
2559

2560 2561
   if (keyword_length > 79 || keyword_length < 1)
      errmsg = "bad keyword";
2562

2563 2564 2565 2566 2567 2568 2569 2570 2571
   /* zTXt must have some LZ data after the keyword, although it may expand to
    * zero bytes; we need a '\0' at the end of the keyword, the compression type
    * then the LZ data:
    */
   else if (keyword_length + 3 > length)
      errmsg = "truncated";

   else if (buffer[keyword_length+1] != PNG_COMPRESSION_TYPE_BASE)
      errmsg = "unknown compression type";
2572

2573
   else
G
Guy Schalnat 已提交
2574
   {
2575
      png_alloc_size_t uncompressed_length = PNG_SIZE_MAX;
2576

2577 2578 2579 2580 2581
      /* TODO: at present png_decompress_chunk imposes a single application
       * level memory limit, this should be split to different values for iCCP
       * and text chunks.
       */
      if (png_decompress_chunk(png_ptr, length, keyword_length+2,
2582
          &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
2583 2584
      {
         png_text text;
2585

2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
         /* It worked; png_ptr->read_buffer now looks like a tEXt chunk except
          * for the extra compression type byte and the fact that it isn't
          * necessarily '\0' terminated.
          */
         buffer = png_ptr->read_buffer;
         buffer[uncompressed_length+(keyword_length+2)] = 0;

         text.compression = PNG_TEXT_COMPRESSION_zTXt;
         text.key = (png_charp)buffer;
         text.text = (png_charp)(buffer + keyword_length+2);
         text.text_length = uncompressed_length;
         text.itxt_length = 0;
         text.lang = NULL;
         text.lang_key = NULL;

2601
         if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
2602 2603
            errmsg = "insufficient memory";
      }
2604

2605 2606
      else
         errmsg = png_ptr->zstream.msg;
2607
   }
2608

2609 2610
   if (errmsg != NULL)
      png_chunk_benign_error(png_ptr, errmsg);
2611 2612
}
#endif
G
Guy Schalnat 已提交
2613

2614
#ifdef PNG_READ_iTXt_SUPPORTED
2615
/* Note: this does not correctly handle chunks that are > 64K under DOS */
2616
void /* PRIVATE */
2617
png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
2618
{
2619 2620 2621
   png_const_charp errmsg = NULL;
   png_bytep buffer;
   png_uint_32 prefix_length;
G
Guy Schalnat 已提交
2622

2623
   png_debug(1, "in png_handle_iTXt");
G
Guy Schalnat 已提交
2624

2625
#ifdef PNG_USER_LIMITS_SUPPORTED
2626 2627 2628 2629 2630 2631 2632
   if (png_ptr->user_chunk_cache_max != 0)
   {
      if (png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
         return;
      }
2633

2634 2635 2636
      if (--png_ptr->user_chunk_cache_max == 1)
      {
         png_crc_finish(png_ptr, length);
2637
         png_chunk_benign_error(png_ptr, "no space in chunk cache");
2638 2639 2640 2641 2642
         return;
      }
   }
#endif

2643
   if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
2644
      png_chunk_error(png_ptr, "missing IHDR");
G
Guy Schalnat 已提交
2645

2646
   if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
2647
      png_ptr->mode |= PNG_AFTER_IDAT;
G
Guy Schalnat 已提交
2648

2649
   buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);
2650

2651
   if (buffer == NULL)
2652
   {
2653 2654
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "out of memory");
2655 2656 2657
      return;
   }

2658
   png_crc_read(png_ptr, buffer, length);
2659

2660
   if (png_crc_finish(png_ptr, 0) != 0)
2661
      return;
A
Andreas Dilger 已提交
2662

2663 2664 2665 2666
   /* First the keyword. */
   for (prefix_length=0;
      prefix_length < length && buffer[prefix_length] != 0;
      ++prefix_length)
2667
      /* Empty loop */ ;
2668

2669 2670 2671
   /* Perform a basic check on the keyword length here. */
   if (prefix_length > 79 || prefix_length < 1)
      errmsg = "bad keyword";
2672

2673 2674 2675
   /* Expect keyword, compression flag, compression type, language, translated
    * keyword (both may be empty but are 0 terminated) then the text, which may
    * be empty.
2676
    */
2677 2678
   else if (prefix_length + 5 > length)
      errmsg = "truncated";
2679

2680 2681 2682
   else if (buffer[prefix_length+1] == 0 ||
      (buffer[prefix_length+1] == 1 &&
      buffer[prefix_length+2] == PNG_COMPRESSION_TYPE_BASE))
2683
   {
2684 2685 2686
      int compressed = buffer[prefix_length+1] != 0;
      png_uint_32 language_offset, translated_keyword_offset;
      png_alloc_size_t uncompressed_length = 0;
2687

2688 2689 2690
      /* Now the language tag */
      prefix_length += 3;
      language_offset = prefix_length;
2691

2692 2693 2694
      for (; prefix_length < length && buffer[prefix_length] != 0;
         ++prefix_length)
         /* Empty loop */ ;
2695

2696 2697
      /* WARNING: the length may be invalid here, this is checked below. */
      translated_keyword_offset = ++prefix_length;
2698

2699 2700 2701
      for (; prefix_length < length && buffer[prefix_length] != 0;
         ++prefix_length)
         /* Empty loop */ ;
2702

2703 2704 2705
      /* prefix_length should now be at the trailing '\0' of the translated
       * keyword, but it may already be over the end.  None of this arithmetic
       * can overflow because chunks are at most 2^31 bytes long, but on 16-bit
2706
       * systems the available allocation may overflow.
2707 2708
       */
      ++prefix_length;
2709

2710
      if (compressed == 0 && prefix_length <= length)
2711
         uncompressed_length = length - prefix_length;
2712

2713
      else if (compressed != 0 && prefix_length < length)
2714 2715
      {
         uncompressed_length = PNG_SIZE_MAX;
2716

2717 2718 2719 2720 2721
         /* TODO: at present png_decompress_chunk imposes a single application
          * level memory limit, this should be split to different values for
          * iCCP and text chunks.
          */
         if (png_decompress_chunk(png_ptr, length, prefix_length,
2722
             &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
2723
            buffer = png_ptr->read_buffer;
2724

2725 2726 2727
         else
            errmsg = png_ptr->zstream.msg;
      }
2728

2729 2730
      else
         errmsg = "truncated";
2731

2732 2733 2734
      if (errmsg == NULL)
      {
         png_text text;
2735

2736
         buffer[uncompressed_length+prefix_length] = 0;
2737

2738
         if (compressed == 0)
2739
            text.compression = PNG_ITXT_COMPRESSION_NONE;
2740

2741 2742
         else
            text.compression = PNG_ITXT_COMPRESSION_zTXt;
2743

2744 2745 2746 2747 2748 2749
         text.key = (png_charp)buffer;
         text.lang = (png_charp)buffer + language_offset;
         text.lang_key = (png_charp)buffer + translated_keyword_offset;
         text.text = (png_charp)buffer + prefix_length;
         text.text_length = 0;
         text.itxt_length = uncompressed_length;
2750

2751
         if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
2752 2753 2754
            errmsg = "insufficient memory";
      }
   }
G
Guy Schalnat 已提交
2755

2756 2757
   else
      errmsg = "bad compression info";
A
Andreas Dilger 已提交
2758

2759 2760
   if (errmsg != NULL)
      png_chunk_benign_error(png_ptr, errmsg);
2761 2762 2763
}
#endif

2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
/* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */
static int
png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
{
   png_alloc_size_t limit = PNG_SIZE_MAX;

   if (png_ptr->unknown_chunk.data != NULL)
   {
      png_free(png_ptr, png_ptr->unknown_chunk.data);
      png_ptr->unknown_chunk.data = NULL;
   }

2777
#  ifdef PNG_SET_USER_LIMITS_SUPPORTED
2778 2779 2780
   if (png_ptr->user_chunk_malloc_max > 0 &&
       png_ptr->user_chunk_malloc_max < limit)
      limit = png_ptr->user_chunk_malloc_max;
2781

2782
#  elif PNG_USER_CHUNK_MALLOC_MAX > 0
2783 2784
   if (PNG_USER_CHUNK_MALLOC_MAX < limit)
      limit = PNG_USER_CHUNK_MALLOC_MAX;
2785
#  endif
2786

2787
   if (length <= limit)
2788
   {
2789 2790 2791 2792
      PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
      /* The following is safe because of the PNG_SIZE_MAX init above */
      png_ptr->unknown_chunk.size = (png_size_t)length/*SAFE*/;
      /* 'mode' is a flag array, only the bottom four bits matter here */
2793
      png_ptr->unknown_chunk.location = (png_byte)png_ptr->mode/*SAFE*/;
2794

2795 2796 2797 2798
      if (length == 0)
         png_ptr->unknown_chunk.data = NULL;

      else
2799
      {
2800 2801
         /* Do a 'warn' here - it is handled below. */
         png_ptr->unknown_chunk.data = png_voidcast(png_bytep,
2802
             png_malloc_warn(png_ptr, length));
2803 2804 2805
      }
   }

2806
   if (png_ptr->unknown_chunk.data == NULL && length > 0)
2807
   {
2808 2809 2810 2811
      /* This is benign because we clean up correctly */
      png_crc_finish(png_ptr, length);
      png_chunk_benign_error(png_ptr, "unknown chunk exceeds memory limits");
      return 0;
2812
   }
2813

2814
   else
A
Andreas Dilger 已提交
2815
   {
2816 2817 2818 2819
      if (length > 0)
         png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length);
      png_crc_finish(png_ptr, 0);
      return 1;
A
Andreas Dilger 已提交
2820
   }
2821
}
2822
#endif /* READ_UNKNOWN_CHUNKS */
2823 2824 2825 2826

/* Handle an unknown, or known but disabled, chunk */
void /* PRIVATE */
png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
2827
    png_uint_32 length, int keep)
2828 2829 2830 2831
{
   int handled = 0; /* the chunk was handled */

   png_debug(1, "in png_handle_unknown");
A
Andreas Dilger 已提交
2832

2833
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844
   /* NOTE: this code is based on the code in libpng-1.4.12 except for fixing
    * the bug which meant that setting a non-default behavior for a specific
    * chunk would be ignored (the default was always used unless a user
    * callback was installed).
    *
    * 'keep' is the value from the png_chunk_unknown_handling, the setting for
    * this specific chunk_name, if PNG_HANDLE_AS_UNKNOWN_SUPPORTED, if not it
    * will always be PNG_HANDLE_CHUNK_AS_DEFAULT and it needs to be set here.
    * This is just an optimization to avoid multiple calls to the lookup
    * function.
    */
2845
#  ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
2846
#     ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
2847
   keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
2848
#     endif
2849
#  endif
2850

2851 2852 2853 2854 2855
   /* One of the following methods will read the chunk or skip it (at least one
    * of these is always defined because this is the only way to switch on
    * PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
    */
#  ifdef PNG_READ_USER_CHUNKS_SUPPORTED
2856 2857 2858 2859 2860 2861
   /* The user callback takes precedence over the chunk keep value, but the
    * keep value is still required to validate a save of a critical chunk.
    */
   if (png_ptr->read_user_chunk_fn != NULL)
   {
      if (png_cache_unknown_chunk(png_ptr, length) != 0)
2862
      {
2863 2864
         /* Callback to user unknown chunk handler */
         int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
2865
             &png_ptr->unknown_chunk);
2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879

         /* ret is:
          * negative: An error occurred; png_chunk_error will be called.
          *     zero: The chunk was not handled, the chunk will be discarded
          *           unless png_set_keep_unknown_chunks has been used to set
          *           a 'keep' behavior for this particular chunk, in which
          *           case that will be used.  A critical chunk will cause an
          *           error at this point unless it is to be saved.
          * positive: The chunk was handled, libpng will ignore/discard it.
          */
         if (ret < 0)
            png_chunk_error(png_ptr, "error in user chunk");

         else if (ret == 0)
2880
         {
2881 2882 2883 2884 2885 2886 2887 2888 2889 2890
            /* If the keep value is 'default' or 'never' override it, but
             * still error out on critical chunks unless the keep value is
             * 'always'  While this is weird it is the behavior in 1.4.12.
             * A possible improvement would be to obey the value set for the
             * chunk, but this would be an API change that would probably
             * damage some applications.
             *
             * The png_app_warning below catches the case that matters, where
             * the application has not set specific save or ignore for this
             * chunk or global save or ignore.
2891
             */
2892
            if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
2893
            {
2894 2895
#              ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
               if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
2896
               {
2897 2898
                  png_chunk_warning(png_ptr, "Saving unknown chunk:");
                  png_app_warning(png_ptr,
2899 2900 2901
                      "forcing save of an unhandled chunk;"
                      " please call png_set_keep_unknown_chunks");
                      /* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
2902
               }
2903 2904
#              endif
               keep = PNG_HANDLE_CHUNK_IF_SAFE;
2905 2906 2907
            }
         }

2908 2909 2910 2911 2912 2913
         else /* chunk was handled */
         {
            handled = 1;
            /* Critical chunks can be safely discarded at this point. */
            keep = PNG_HANDLE_CHUNK_NEVER;
         }
2914
      }
2915

2916
      else
2917 2918 2919 2920 2921
         keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
   }

   else
   /* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
2922
#  endif /* READ_USER_CHUNKS */
2923 2924

#  ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
2925 2926 2927 2928 2929 2930 2931 2932
   {
      /* keep is currently just the per-chunk setting, if there was no
       * setting change it to the global default now (not that this may
       * still be AS_DEFAULT) then obtain the cache of the chunk if required,
       * if not simply skip the chunk.
       */
      if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
         keep = png_ptr->unknown_default;
2933

2934 2935 2936 2937 2938 2939
      if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
         (keep == PNG_HANDLE_CHUNK_IF_SAFE &&
          PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
      {
         if (png_cache_unknown_chunk(png_ptr, length) == 0)
            keep = PNG_HANDLE_CHUNK_NEVER;
2940
      }
2941 2942 2943 2944

      else
         png_crc_finish(png_ptr, length);
   }
2945 2946 2947 2948
#  else
#     ifndef PNG_READ_USER_CHUNKS_SUPPORTED
#        error no method to support READ_UNKNOWN_CHUNKS
#     endif
2949

2950 2951 2952 2953 2954 2955 2956 2957 2958
   {
      /* If here there is no read callback pointer set and no support is
       * compiled in to just save the unknown chunks, so simply skip this
       * chunk.  If 'keep' is something other than AS_DEFAULT or NEVER then
       * the app has erroneously asked for unknown chunk saving when there
       * is no support.
       */
      if (keep > PNG_HANDLE_CHUNK_NEVER)
         png_app_error(png_ptr, "no unknown chunk support available");
2959

2960 2961
      png_crc_finish(png_ptr, length);
   }
2962
#  endif
2963

2964
#  ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
2965 2966 2967 2968 2969 2970 2971
   /* Now store the chunk in the chunk list if appropriate, and if the limits
    * permit it.
    */
   if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
      (keep == PNG_HANDLE_CHUNK_IF_SAFE &&
       PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
   {
2972
#     ifdef PNG_USER_LIMITS_SUPPORTED
2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993
      switch (png_ptr->user_chunk_cache_max)
      {
         case 2:
            png_ptr->user_chunk_cache_max = 1;
            png_chunk_benign_error(png_ptr, "no space in chunk cache");
            /* FALL THROUGH */
         case 1:
            /* NOTE: prior to 1.6.0 this case resulted in an unknown critical
             * chunk being skipped, now there will be a hard error below.
             */
            break;

         default: /* not at limit */
            --(png_ptr->user_chunk_cache_max);
            /* FALL THROUGH */
         case 0: /* no limit */
#  endif /* USER_LIMITS */
            /* Here when the limit isn't reached or when limits are compiled
             * out; store the chunk.
             */
            png_set_unknown_chunks(png_ptr, info_ptr,
2994
                &png_ptr->unknown_chunk, 1);
2995 2996 2997
            handled = 1;
#  ifdef PNG_USER_LIMITS_SUPPORTED
            break;
2998
      }
2999 3000
#  endif
   }
3001
#  else /* no store support: the chunk must be handled by the user callback */
3002
   PNG_UNUSED(info_ptr)
3003
#  endif
3004

3005 3006 3007 3008 3009
   /* Regardless of the error handling below the cached data (if any) can be
    * freed now.  Notice that the data is not freed if there is a png_error, but
    * it will be freed by destroy_read_struct.
    */
   if (png_ptr->unknown_chunk.data != NULL)
3010
      png_free(png_ptr, png_ptr->unknown_chunk.data);
3011
   png_ptr->unknown_chunk.data = NULL;
3012

3013 3014 3015 3016 3017
#else /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */
   /* There is no support to read an unknown chunk, so just skip it. */
   png_crc_finish(png_ptr, length);
   PNG_UNUSED(info_ptr)
   PNG_UNUSED(keep)
3018
#endif /* !READ_UNKNOWN_CHUNKS */
3019

3020
   /* Check for unhandled critical chunks */
3021
   if (handled == 0 && PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
3022
      png_chunk_error(png_ptr, "unhandled critical chunk");
A
Andreas Dilger 已提交
3023 3024 3025
}

/* This function is called to verify that a chunk name is valid.
3026 3027 3028 3029 3030
 * This function can't have the "critical chunk check" incorporated
 * into it, since in the future we will need to be able to call user
 * functions to handle unknown critical chunks after we check that
 * the chunk name itself is valid.
 */
A
Andreas Dilger 已提交
3031

3032 3033 3034 3035
/* Bit hacking: the test for an invalid byte in the 4 byte chunk name is:
 *
 * ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
 */
A
Andreas Dilger 已提交
3036

3037
void /* PRIVATE */
3038
png_check_chunk_name(png_structrp png_ptr, png_uint_32 chunk_name)
A
Andreas Dilger 已提交
3039
{
3040 3041
   int i;

3042
   png_debug(1, "in png_check_chunk_name");
3043 3044

   for (i=1; i<=4; ++i)
A
Andreas Dilger 已提交
3045
   {
3046 3047 3048 3049 3050 3051
      int c = chunk_name & 0xff;

      if (c < 65 || c > 122 || (c > 90 && c < 97))
         png_chunk_error(png_ptr, "invalid chunk type");

      chunk_name >>= 8;
A
Andreas Dilger 已提交
3052 3053 3054
   }
}

3055 3056 3057 3058 3059 3060
/* Combines the row recently read in with the existing pixels in the row.  This
 * routine takes care of alpha and transparency if requested.  This routine also
 * handles the two methods of progressive display of interlaced images,
 * depending on the 'display' value; if 'display' is true then the whole row
 * (dp) is filled from the start by replicating the available pixels.  If
 * 'display' is false only those pixels present in the pass are filled in.
3061
 */
3062
void /* PRIVATE */
3063
png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
G
Guy Schalnat 已提交
3064
{
3065 3066
   unsigned int pixel_depth = png_ptr->transformed_pixel_depth;
   png_const_bytep sp = png_ptr->row_buf + 1;
3067
   png_alloc_size_t row_width = png_ptr->width;
3068
   unsigned int pass = png_ptr->pass;
3069 3070 3071
   png_bytep end_ptr = 0;
   png_byte end_byte = 0;
   unsigned int end_mask;
3072

3073
   png_debug(1, "in png_combine_row");
3074

3075 3076 3077 3078 3079 3080 3081 3082
   /* Added in 1.5.6: it should not be possible to enter this routine until at
    * least one row has been read from the PNG data and transformed.
    */
   if (pixel_depth == 0)
      png_error(png_ptr, "internal row logic error");

   /* Added in 1.5.4: the pixel depth should match the information returned by
    * any call to png_read_update_info at this point.  Do not continue if we got
3083 3084 3085
    * this wrong.
    */
   if (png_ptr->info_rowbytes != 0 && png_ptr->info_rowbytes !=
3086
          PNG_ROWBYTES(pixel_depth, row_width))
3087 3088
      png_error(png_ptr, "internal row size calculation error");

3089 3090 3091
   /* Don't expect this to ever happen: */
   if (row_width == 0)
      png_error(png_ptr, "internal row width error");
3092

3093 3094 3095 3096 3097 3098 3099
   /* Preserve the last byte in cases where only part of it will be overwritten,
    * the multiply below may overflow, we don't care because ANSI-C guarantees
    * we get the low bits.
    */
   end_mask = (pixel_depth * row_width) & 7;
   if (end_mask != 0)
   {
3100
      /* end_ptr == NULL is a flag to say do nothing */
3101 3102 3103
      end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
      end_byte = *end_ptr;
#     ifdef PNG_READ_PACKSWAP_SUPPORTED
3104 3105
      if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
         /* little-endian byte */
3106
         end_mask = (unsigned int)(0xff << end_mask);
3107

3108
      else /* big-endian byte */
3109
#     endif
3110
      end_mask = 0xff >> end_mask;
3111 3112 3113
      /* end_mask is now the bits to *keep* from the destination row */
   }

3114
   /* For non-interlaced images this reduces to a memcpy(). A memcpy()
3115 3116 3117 3118
    * will also happen if interlacing isn't supported or if the application
    * does not call png_set_interlace_handling().  In the latter cases the
    * caller just gets a sequence of the unexpanded rows from each interlace
    * pass.
3119 3120
    */
#ifdef PNG_READ_INTERLACING_SUPPORTED
3121 3122 3123 3124 3125
   if (png_ptr->interlaced != 0 &&
       (png_ptr->transformations & PNG_INTERLACE) != 0 &&
       pass < 6 && (display == 0 ||
       /* The following copies everything for 'display' on passes 0, 2 and 4. */
       (display == 1 && (pass & 1) != 0)))
G
Guy Schalnat 已提交
3126
   {
3127 3128
      /* Narrow images may have no bits in a pass; the caller should handle
       * this, but this test is cheap:
3129
       */
3130 3131
      if (row_width <= PNG_PASS_START_COL(pass))
         return;
3132

3133
      if (pixel_depth < 8)
G
Guy Schalnat 已提交
3134
      {
3135
         /* For pixel depths up to 4 bpp the 8-pixel mask can be expanded to fit
3136
          * into 32 bits, then a single loop over the bytes using the four byte
3137
          * values in the 32-bit mask can be used.  For the 'display' option the
3138 3139 3140 3141 3142 3143
          * expanded mask may also not require any masking within a byte.  To
          * make this work the PACKSWAP option must be taken into account - it
          * simply requires the pixels to be reversed in each byte.
          *
          * The 'regular' case requires a mask for each of the first 6 passes,
          * the 'display' case does a copy for the even passes in the range
3144
          * 0..6.  This has already been handled in the test above.
3145 3146 3147 3148 3149 3150 3151
          *
          * The masks are arranged as four bytes with the first byte to use in
          * the lowest bits (little-endian) regardless of the order (PACKSWAP or
          * not) of the pixels in each byte.
          *
          * NOTE: the whole of this logic depends on the caller of this function
          * only calling it on rows appropriate to the pass.  This function only
3152
          * understands the 'x' logic; the 'y' logic is handled by the caller.
3153 3154 3155
          *
          * The following defines allow generation of compile time constant bit
          * masks for each pixel depth and each possibility of swapped or not
3156 3157 3158 3159 3160
          * swapped bytes.  Pass 'p' is in the range 0..6; 'x', a pixel index,
          * is in the range 0..7; and the result is 1 if the pixel is to be
          * copied in the pass, 0 if not.  'S' is for the sparkle method, 'B'
          * for the block method.
          *
3161
          * With some compilers a compile time expression of the general form:
3162
          *
3163 3164 3165
          *    (shift >= 32) ? (a >> (shift-32)) : (b >> shift)
          *
          * Produces warnings with values of 'shift' in the range 33 to 63
3166
          * because the right hand side of the ?: expression is evaluated by
3167 3168 3169
          * the compiler even though it isn't used.  Microsoft Visual C (various
          * versions) and the Intel C compiler are known to do this.  To avoid
          * this the following macros are used in 1.5.6.  This is a temporary
3170
          * solution to avoid destabilizing the code during the release process.
3171
          */
3172
#        if PNG_USE_COMPILE_TIME_MASKS
3173 3174
#           define PNG_LSR(x,s) ((x)>>((s) & 0x1f))
#           define PNG_LSL(x,s) ((x)<<((s) & 0x1f))
3175
#        else
3176 3177
#           define PNG_LSR(x,s) ((x)>>(s))
#           define PNG_LSL(x,s) ((x)<<(s))
3178
#        endif
3179 3180 3181 3182
#        define S_COPY(p,x) (((p)<4 ? PNG_LSR(0x80088822,(3-(p))*8+(7-(x))) :\
           PNG_LSR(0xaa55ff00,(7-(p))*8+(7-(x)))) & 1)
#        define B_COPY(p,x) (((p)<4 ? PNG_LSR(0xff0fff33,(3-(p))*8+(7-(x))) :\
           PNG_LSR(0xff55ff00,(7-(p))*8+(7-(x)))) & 1)
3183 3184 3185 3186 3187 3188 3189

         /* Return a mask for pass 'p' pixel 'x' at depth 'd'.  The mask is
          * little endian - the first pixel is at bit 0 - however the extra
          * parameter 's' can be set to cause the mask position to be swapped
          * within each byte, to match the PNG format.  This is done by XOR of
          * the shift with 7, 6 or 4 for bit depths 1, 2 and 4.
          */
3190 3191
#        define PIXEL_MASK(p,x,d,s) \
            (PNG_LSL(((PNG_LSL(1U,(d)))-1),(((x)*(d))^((s)?8-(d):0))))
3192 3193 3194 3195 3196 3197

         /* Hence generate the appropriate 'block' or 'sparkle' pixel copy mask.
          */
#        define S_MASKx(p,x,d,s) (S_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)
#        define B_MASKx(p,x,d,s) (B_COPY(p,x)?PIXEL_MASK(p,x,d,s):0)

3198 3199 3200
         /* Combine 8 of these to get the full mask.  For the 1-bpp and 2-bpp
          * cases the result needs replicating, for the 4-bpp case the above
          * generates a full 32 bits.
3201
          */
3202
#        define MASK_EXPAND(m,d) ((m)*((d)==1?0x01010101:((d)==2?0x00010001:1)))
3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214

#        define S_MASK(p,d,s) MASK_EXPAND(S_MASKx(p,0,d,s) + S_MASKx(p,1,d,s) +\
            S_MASKx(p,2,d,s) + S_MASKx(p,3,d,s) + S_MASKx(p,4,d,s) +\
            S_MASKx(p,5,d,s) + S_MASKx(p,6,d,s) + S_MASKx(p,7,d,s), d)

#        define B_MASK(p,d,s) MASK_EXPAND(B_MASKx(p,0,d,s) + B_MASKx(p,1,d,s) +\
            B_MASKx(p,2,d,s) + B_MASKx(p,3,d,s) + B_MASKx(p,4,d,s) +\
            B_MASKx(p,5,d,s) + B_MASKx(p,6,d,s) + B_MASKx(p,7,d,s), d)

#if PNG_USE_COMPILE_TIME_MASKS
         /* Utility macros to construct all the masks for a depth/swap
          * combination.  The 's' parameter says whether the format is PNG
3215
          * (big endian bytes) or not.  Only the three odd-numbered passes are
3216 3217 3218 3219 3220
          * required for the display/block algorithm.
          */
#        define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\
            S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) }

3221
#        define B_MASKS(d,s) { B_MASK(1,d,s), B_MASK(3,d,s), B_MASK(5,d,s) }
3222 3223 3224 3225 3226 3227

#        define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2))

         /* Hence the pre-compiled masks indexed by PACKSWAP (or not), depth and
          * then pass:
          */
3228 3229
         static PNG_CONST png_uint_32 row_mask[2/*PACKSWAP*/][3/*depth*/][6] =
         {
3230 3231 3232 3233 3234 3235 3236 3237 3238
            /* Little-endian byte masks for PACKSWAP */
            { S_MASKS(1,0), S_MASKS(2,0), S_MASKS(4,0) },
            /* Normal (big-endian byte) masks - PNG format */
            { S_MASKS(1,1), S_MASKS(2,1), S_MASKS(4,1) }
         };

         /* display_mask has only three entries for the odd passes, so index by
          * pass>>1.
          */
3239 3240
         static PNG_CONST png_uint_32 display_mask[2][3][3] =
         {
3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256
            /* Little-endian byte masks for PACKSWAP */
            { B_MASKS(1,0), B_MASKS(2,0), B_MASKS(4,0) },
            /* Normal (big-endian byte) masks - PNG format */
            { B_MASKS(1,1), B_MASKS(2,1), B_MASKS(4,1) }
         };

#        define MASK(pass,depth,display,png)\
            ((display)?display_mask[png][DEPTH_INDEX(depth)][pass>>1]:\
               row_mask[png][DEPTH_INDEX(depth)][pass])

#else /* !PNG_USE_COMPILE_TIME_MASKS */
         /* This is the runtime alternative: it seems unlikely that this will
          * ever be either smaller or faster than the compile time approach.
          */
#        define MASK(pass,depth,display,png)\
            ((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png))
3257
#endif /* !USE_COMPILE_TIME_MASKS */
3258 3259

         /* Use the appropriate mask to copy the required bits.  In some cases
3260
          * the byte mask will be 0 or 0xff; optimize these cases.  row_width is
3261 3262 3263 3264 3265 3266 3267
          * the number of pixels, but the code copies bytes, so it is necessary
          * to special case the end.
          */
         png_uint_32 pixels_per_byte = 8 / pixel_depth;
         png_uint_32 mask;

#        ifdef PNG_READ_PACKSWAP_SUPPORTED
3268 3269
         if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
            mask = MASK(pass, pixel_depth, display, 0);
3270

3271
         else
3272
#        endif
3273
         mask = MASK(pass, pixel_depth, display, 1);
3274 3275

         for (;;)
G
Guy Schalnat 已提交
3276
         {
3277
            png_uint_32 m;
G
Guy Schalnat 已提交
3278

3279
            /* It doesn't matter in the following if png_uint_32 has more than
3280
             * 32 bits because the high bits always match those in m<<24; it is,
3281 3282 3283 3284 3285
             * however, essential to use OR here, not +, because of this.
             */
            m = mask;
            mask = (m >> 8) | (m << 24); /* rotate right to good compilers */
            m &= 0xff;
3286

3287
            if (m != 0) /* something to copy */
A
Andreas Dilger 已提交
3288
            {
3289
               if (m != 0xff)
3290
                  *dp = (png_byte)((*dp & ~m) | (*sp & m));
3291 3292
               else
                  *dp = *sp;
A
Andreas Dilger 已提交
3293
            }
3294

3295
            /* NOTE: this may overwrite the last byte with garbage if the image
3296
             * is not an exact number of bytes wide; libpng has always done
3297 3298 3299
             * this.
             */
            if (row_width <= pixels_per_byte)
3300
               break; /* May need to restore part of the last byte */
3301

3302 3303 3304 3305 3306
            row_width -= pixels_per_byte;
            ++dp;
            ++sp;
         }
      }
3307

3308 3309 3310
      else /* pixel_depth >= 8 */
      {
         unsigned int bytes_to_copy, bytes_to_jump;
3311

3312 3313 3314
         /* Validate the depth - it must be a multiple of 8 */
         if (pixel_depth & 7)
            png_error(png_ptr, "invalid user transform pixel depth");
3315

3316 3317
         pixel_depth >>= 3; /* now in bytes */
         row_width *= pixel_depth;
3318

3319 3320 3321 3322
         /* Regardless of pass number the Adam 7 interlace always results in a
          * fixed number of pixels to copy then to skip.  There may be a
          * different number of pixels to skip at the start though.
          */
G
Guy Schalnat 已提交
3323
         {
3324
            unsigned int offset = PNG_PASS_START_COL(pass) * pixel_depth;
3325

3326 3327 3328 3329
            row_width -= offset;
            dp += offset;
            sp += offset;
         }
3330

3331
         /* Work out the bytes to copy. */
3332
         if (display != 0)
3333 3334 3335 3336
         {
            /* When doing the 'block' algorithm the pixel in the pass gets
             * replicated to adjacent pixels.  This is why the even (0,2,4,6)
             * passes are skipped above - the entire expanded row is copied.
3337
             */
3338
            bytes_to_copy = (1<<((6-pass)>>1)) * pixel_depth;
3339

3340 3341
            /* But don't allow this number to exceed the actual row width. */
            if (bytes_to_copy > row_width)
3342
               bytes_to_copy = (unsigned int)/*SAFE*/row_width;
3343
         }
3344

3345 3346
         else /* normal row; Adam7 only ever gives us one pixel to copy. */
            bytes_to_copy = pixel_depth;
3347

3348 3349
         /* In Adam7 there is a constant offset between where the pixels go. */
         bytes_to_jump = PNG_PASS_COL_OFFSET(pass) * pixel_depth;
3350

3351
         /* And simply copy these bytes.  Some optimization is possible here,
3352
          * depending on the value of 'bytes_to_copy'.  Special case the low
3353
          * byte counts, which we know to be frequent.
3354 3355 3356 3357
          *
          * Notice that these cases all 'return' rather than 'break' - this
          * avoids an unnecessary test on whether to restore the last byte
          * below.
3358 3359 3360 3361 3362
          */
         switch (bytes_to_copy)
         {
            case 1:
               for (;;)
3363
               {
3364
                  *dp = *sp;
G
Guy Schalnat 已提交
3365

3366 3367
                  if (row_width <= bytes_to_jump)
                     return;
3368

3369 3370 3371
                  dp += bytes_to_jump;
                  sp += bytes_to_jump;
                  row_width -= bytes_to_jump;
3372
               }
3373

3374
            case 2:
3375
               /* There is a possibility of a partial copy at the end here; this
3376 3377
                * slows the code down somewhat.
                */
3378
               do
3379
               {
3380
                  dp[0] = sp[0], dp[1] = sp[1];
3381

3382 3383
                  if (row_width <= bytes_to_jump)
                     return;
3384

3385 3386 3387
                  sp += bytes_to_jump;
                  dp += bytes_to_jump;
                  row_width -= bytes_to_jump;
3388
               }
3389
               while (row_width > 1);
3390

3391 3392 3393
               /* And there can only be one byte left at this point: */
               *dp = *sp;
               return;
3394

3395 3396 3397 3398
            case 3:
               /* This can only be the RGB case, so each copy is exactly one
                * pixel and it is not necessary to check for a partial copy.
                */
3399
               for (;;)
3400
               {
3401
                  dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2];
3402

3403 3404
                  if (row_width <= bytes_to_jump)
                     return;
3405

3406 3407 3408
                  sp += bytes_to_jump;
                  dp += bytes_to_jump;
                  row_width -= bytes_to_jump;
3409 3410
               }

3411 3412
            default:
#if PNG_ALIGN_TYPE != PNG_ALIGN_NONE
3413 3414
               /* Check for double byte alignment and, if possible, use a
                * 16-bit copy.  Don't attempt this for narrow images - ones that
3415
                * are less than an interlace panel wide.  Don't attempt it for
3416
                * wide bytes_to_copy either - use the memcpy there.
3417
                */
3418
               if (bytes_to_copy < 16 /*else use memcpy*/ &&
3419 3420 3421 3422
                   png_isaligned(dp, png_uint_16) &&
                   png_isaligned(sp, png_uint_16) &&
                   bytes_to_copy % (sizeof (png_uint_16)) == 0 &&
                   bytes_to_jump % (sizeof (png_uint_16)) == 0)
3423
               {
3424 3425 3426
                  /* Everything is aligned for png_uint_16 copies, but try for
                   * png_uint_32 first.
                   */
3427 3428
                  if (png_isaligned(dp, png_uint_32) &&
                      png_isaligned(sp, png_uint_32) &&
3429 3430
                      bytes_to_copy % (sizeof (png_uint_32)) == 0 &&
                      bytes_to_jump % (sizeof (png_uint_32)) == 0)
3431
                  {
3432 3433
                     png_uint_32p dp32 = png_aligncast(png_uint_32p,dp);
                     png_const_uint_32p sp32 = png_aligncastconst(
3434
                         png_const_uint_32p, sp);
3435
                     size_t skip = (bytes_to_jump-bytes_to_copy) /
3436
                         (sizeof (png_uint_32));
3437 3438 3439 3440 3441 3442 3443

                     do
                     {
                        size_t c = bytes_to_copy;
                        do
                        {
                           *dp32++ = *sp32++;
3444
                           c -= (sizeof (png_uint_32));
3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458
                        }
                        while (c > 0);

                        if (row_width <= bytes_to_jump)
                           return;

                        dp32 += skip;
                        sp32 += skip;
                        row_width -= bytes_to_jump;
                     }
                     while (bytes_to_copy <= row_width);

                     /* Get to here when the row_width truncates the final copy.
                      * There will be 1-3 bytes left to copy, so don't try the
3459
                      * 16-bit loop below.
3460 3461 3462 3463 3464 3465 3466 3467 3468
                      */
                     dp = (png_bytep)dp32;
                     sp = (png_const_bytep)sp32;
                     do
                        *dp++ = *sp++;
                     while (--row_width > 0);
                     return;
                  }

3469
                  /* Else do it in 16-bit quantities, but only if the size is
3470 3471 3472 3473
                   * not too large.
                   */
                  else
                  {
3474 3475 3476
                     png_uint_16p dp16 = png_aligncast(png_uint_16p, dp);
                     png_const_uint_16p sp16 = png_aligncastconst(
                        png_const_uint_16p, sp);
3477
                     size_t skip = (bytes_to_jump-bytes_to_copy) /
3478
                        (sizeof (png_uint_16));
3479 3480 3481 3482 3483 3484 3485

                     do
                     {
                        size_t c = bytes_to_copy;
                        do
                        {
                           *dp16++ = *sp16++;
3486
                           c -= (sizeof (png_uint_16));
3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498
                        }
                        while (c > 0);

                        if (row_width <= bytes_to_jump)
                           return;

                        dp16 += skip;
                        sp16 += skip;
                        row_width -= bytes_to_jump;
                     }
                     while (bytes_to_copy <= row_width);

3499
                     /* End of row - 1 byte left, bytes_to_copy > row_width: */
3500 3501 3502 3503 3504 3505 3506 3507
                     dp = (png_bytep)dp16;
                     sp = (png_const_bytep)sp16;
                     do
                        *dp++ = *sp++;
                     while (--row_width > 0);
                     return;
                  }
               }
3508
#endif /* ALIGN_TYPE code */
3509

3510
               /* The true default - use a memcpy: */
3511 3512
               for (;;)
               {
3513
                  memcpy(dp, sp, bytes_to_copy);
3514

3515 3516
                  if (row_width <= bytes_to_jump)
                     return;
3517

3518 3519 3520 3521
                  sp += bytes_to_jump;
                  dp += bytes_to_jump;
                  row_width -= bytes_to_jump;
                  if (bytes_to_copy > row_width)
3522
                     bytes_to_copy = (unsigned int)/*SAFE*/row_width;
3523
               }
G
Guy Schalnat 已提交
3524
         }
3525 3526

         /* NOT REACHED*/
3527
      } /* pixel_depth >= 8 */
3528

3529
      /* Here if pixel_depth < 8 to check 'end_ptr' below. */
G
Guy Schalnat 已提交
3530
   }
3531
   else
3532
#endif /* READ_INTERLACING */
3533

3534
   /* If here then the switch above wasn't used so just memcpy the whole row
3535 3536
    * from the temporary row buffer (notice that this overwrites the end of the
    * destination row if it is a partial byte.)
3537
    */
3538
   memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width));
3539 3540 3541

   /* Restore the overwritten bits from the last byte if necessary. */
   if (end_ptr != NULL)
3542
      *end_ptr = (png_byte)((end_byte & end_mask) | (*end_ptr & ~end_mask));
G
Guy Schalnat 已提交
3543 3544
}

3545
#ifdef PNG_READ_INTERLACING_SUPPORTED
3546
void /* PRIVATE */
3547
png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
3548
    png_uint_32 transformations /* Because these may affect the byte layout */)
G
Guy Schalnat 已提交
3549
{
3550 3551
   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
   /* Offset to next interlace block */
3552
   static PNG_CONST unsigned int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
3553

3554
   png_debug(1, "in png_do_read_interlace");
3555
   if (row != NULL && row_info != NULL)
G
Guy Schalnat 已提交
3556
   {
3557 3558 3559
      png_uint_32 final_width;

      final_width = row_info->width * png_pass_inc[pass];
G
Guy Schalnat 已提交
3560 3561 3562 3563 3564

      switch (row_info->pixel_depth)
      {
         case 1:
         {
3565 3566
            png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3);
            png_bytep dp = row + (png_size_t)((final_width - 1) >> 3);
3567 3568 3569 3570
            unsigned int sshift, dshift;
            unsigned int s_start, s_end;
            int s_inc;
            int jstop = (int)png_pass_inc[pass];
3571
            png_byte v;
G
Guy Schalnat 已提交
3572
            png_uint_32 i;
3573
            int j;
G
Guy Schalnat 已提交
3574

3575
#ifdef PNG_READ_PACKSWAP_SUPPORTED
3576
            if ((transformations & PNG_PACKSWAP) != 0)
A
Andreas Dilger 已提交
3577
            {
3578 3579
                sshift = ((row_info->width + 7) & 0x07);
                dshift = ((final_width + 7) & 0x07);
3580 3581 3582
                s_start = 7;
                s_end = 0;
                s_inc = -1;
A
Andreas Dilger 已提交
3583
            }
3584

3585
            else
A
Andreas Dilger 已提交
3586
#endif
G
Guy Schalnat 已提交
3587
            {
3588 3589
                sshift = 7 - ((row_info->width + 7) & 0x07);
                dshift = 7 - ((final_width + 7) & 0x07);
3590 3591 3592 3593
                s_start = 0;
                s_end = 7;
                s_inc = 1;
            }
3594

3595 3596 3597 3598
            for (i = 0; i < row_info->width; i++)
            {
               v = (png_byte)((*sp >> sshift) & 0x01);
               for (j = 0; j < jstop; j++)
G
Guy Schalnat 已提交
3599
               {
3600
                  unsigned int tmp = *dp & (0x7f7f >> (7 - dshift));
3601
                  tmp |= (unsigned int)(v << dshift);
3602
                  *dp = (png_byte)(tmp & 0xff);
3603

3604 3605 3606 3607 3608
                  if (dshift == s_end)
                  {
                     dshift = s_start;
                     dp--;
                  }
3609

3610
                  else
3611
                     dshift = (unsigned int)((int)dshift + s_inc);
G
Guy Schalnat 已提交
3612
               }
3613

3614
               if (sshift == s_end)
G
Guy Schalnat 已提交
3615
               {
3616
                  sshift = s_start;
G
Guy Schalnat 已提交
3617 3618
                  sp--;
               }
3619

3620
               else
3621
                  sshift = (unsigned int)((int)sshift + s_inc);
G
Guy Schalnat 已提交
3622 3623 3624
            }
            break;
         }
3625

G
Guy Schalnat 已提交
3626 3627
         case 2:
         {
3628 3629
            png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2);
            png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2);
3630 3631 3632 3633
            unsigned int sshift, dshift;
            unsigned int s_start, s_end;
            int s_inc;
            int jstop = (int)png_pass_inc[pass];
A
Andreas Dilger 已提交
3634
            png_uint_32 i;
G
Guy Schalnat 已提交
3635

3636
#ifdef PNG_READ_PACKSWAP_SUPPORTED
3637
            if ((transformations & PNG_PACKSWAP) != 0)
A
Andreas Dilger 已提交
3638
            {
3639 3640
               sshift = (((row_info->width + 3) & 0x03) << 1);
               dshift = (((final_width + 3) & 0x03) << 1);
3641 3642 3643
               s_start = 6;
               s_end = 0;
               s_inc = -2;
A
Andreas Dilger 已提交
3644
            }
3645

3646
            else
A
Andreas Dilger 已提交
3647
#endif
3648
            {
3649 3650
               sshift = ((3 - ((row_info->width + 3) & 0x03)) << 1);
               dshift = ((3 - ((final_width + 3) & 0x03)) << 1);
3651 3652 3653 3654
               s_start = 0;
               s_end = 6;
               s_inc = 2;
            }
A
Andreas Dilger 已提交
3655

3656
            for (i = 0; i < row_info->width; i++)
G
Guy Schalnat 已提交
3657
            {
3658 3659
               png_byte v;
               int j;
A
Andreas Dilger 已提交
3660

3661 3662
               v = (png_byte)((*sp >> sshift) & 0x03);
               for (j = 0; j < jstop; j++)
G
Guy Schalnat 已提交
3663
               {
3664
                  unsigned int tmp = *dp & (0x3f3f >> (6 - dshift));
3665
                  tmp |= (unsigned int)(v << dshift);
3666
                  *dp = (png_byte)(tmp & 0xff);
3667

3668 3669 3670 3671 3672
                  if (dshift == s_end)
                  {
                     dshift = s_start;
                     dp--;
                  }
3673

3674
                  else
3675
                     dshift = (unsigned int)((int)dshift + s_inc);
G
Guy Schalnat 已提交
3676
               }
3677

3678
               if (sshift == s_end)
G
Guy Schalnat 已提交
3679
               {
3680
                  sshift = s_start;
G
Guy Schalnat 已提交
3681 3682
                  sp--;
               }
3683

3684
               else
3685
                  sshift = (unsigned int)((int)sshift + s_inc);
G
Guy Schalnat 已提交
3686 3687 3688
            }
            break;
         }
3689

G
Guy Schalnat 已提交
3690 3691
         case 4:
         {
3692 3693
            png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1);
            png_bytep dp = row + (png_size_t)((final_width - 1) >> 1);
3694 3695 3696
            unsigned int sshift, dshift;
            unsigned int s_start, s_end;
            int s_inc;
G
Guy Schalnat 已提交
3697
            png_uint_32 i;
3698
            int jstop = (int)png_pass_inc[pass];
G
Guy Schalnat 已提交
3699

3700
#ifdef PNG_READ_PACKSWAP_SUPPORTED
3701
            if ((transformations & PNG_PACKSWAP) != 0)
A
Andreas Dilger 已提交
3702
            {
3703 3704
               sshift = (((row_info->width + 1) & 0x01) << 2);
               dshift = (((final_width + 1) & 0x01) << 2);
3705 3706 3707
               s_start = 4;
               s_end = 0;
               s_inc = -4;
A
Andreas Dilger 已提交
3708
            }
3709

3710
            else
A
Andreas Dilger 已提交
3711 3712
#endif
            {
3713 3714
               sshift = ((1 - ((row_info->width + 1) & 0x01)) << 2);
               dshift = ((1 - ((final_width + 1) & 0x01)) << 2);
3715 3716 3717 3718
               s_start = 0;
               s_end = 4;
               s_inc = 4;
            }
A
Andreas Dilger 已提交
3719

3720 3721
            for (i = 0; i < row_info->width; i++)
            {
3722
               png_byte v = (png_byte)((*sp >> sshift) & 0x0f);
3723
               int j;
A
Andreas Dilger 已提交
3724

3725
               for (j = 0; j < jstop; j++)
G
Guy Schalnat 已提交
3726
               {
3727
                  unsigned int tmp = *dp & (0xf0f >> (4 - dshift));
3728
                  tmp |= (unsigned int)(v << dshift);
3729
                  *dp = (png_byte)(tmp & 0xff);
3730

3731 3732 3733 3734 3735
                  if (dshift == s_end)
                  {
                     dshift = s_start;
                     dp--;
                  }
3736

3737
                  else
3738
                     dshift = (unsigned int)((int)dshift + s_inc);
G
Guy Schalnat 已提交
3739
               }
3740

3741
               if (sshift == s_end)
G
Guy Schalnat 已提交
3742
               {
3743
                  sshift = s_start;
G
Guy Schalnat 已提交
3744 3745
                  sp--;
               }
3746

3747
               else
3748
                  sshift = (unsigned int)((int)sshift + s_inc);
G
Guy Schalnat 已提交
3749 3750 3751
            }
            break;
         }
3752

G
Guy Schalnat 已提交
3753 3754
         default:
         {
3755
            png_size_t pixel_bytes = (row_info->pixel_depth >> 3);
3756

3757 3758
            png_bytep sp = row + (png_size_t)(row_info->width - 1)
                * pixel_bytes;
3759

3760 3761
            png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;

3762
            int jstop = (int)png_pass_inc[pass];
A
Andreas Dilger 已提交
3763
            png_uint_32 i;
G
Guy Schalnat 已提交
3764

3765
            for (i = 0; i < row_info->width; i++)
G
Guy Schalnat 已提交
3766
            {
3767
               png_byte v[8]; /* SAFE; pixel_depth does not exceed 64 */
3768 3769
               int j;

3770
               memcpy(v, sp, pixel_bytes);
3771

3772 3773
               for (j = 0; j < jstop; j++)
               {
3774
                  memcpy(dp, v, pixel_bytes);
3775 3776
                  dp -= pixel_bytes;
               }
3777

3778
               sp -= pixel_bytes;
G
Guy Schalnat 已提交
3779 3780 3781 3782
            }
            break;
         }
      }
3783

G
Guy Schalnat 已提交
3784
      row_info->width = final_width;
3785
      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width);
G
Guy Schalnat 已提交
3786
   }
3787
#ifndef PNG_READ_PACKSWAP_SUPPORTED
3788
   PNG_UNUSED(transformations)  /* Silence compiler warning */
3789
#endif
G
Guy Schalnat 已提交
3790
}
3791
#endif /* READ_INTERLACING */
G
Guy Schalnat 已提交
3792

3793 3794
static void
png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
3795
    png_const_bytep prev_row)
3796
{
3797 3798 3799 3800 3801 3802 3803 3804
   png_size_t i;
   png_size_t istop = row_info->rowbytes;
   unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
   png_bytep rp = row + bpp;

   PNG_UNUSED(prev_row)

   for (i = bpp; i < istop; i++)
3805
   {
3806
      *rp = (png_byte)(((int)(*rp) + (int)(*(rp-bpp))) & 0xff);
3807 3808 3809
      rp++;
   }
}
3810

3811 3812
static void
png_read_filter_row_up(png_row_infop row_info, png_bytep row,
3813
    png_const_bytep prev_row)
3814 3815 3816 3817 3818
{
   png_size_t i;
   png_size_t istop = row_info->rowbytes;
   png_bytep rp = row;
   png_const_bytep pp = prev_row;
3819

3820 3821 3822 3823 3824 3825
   for (i = 0; i < istop; i++)
   {
      *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
      rp++;
   }
}
3826

3827 3828
static void
png_read_filter_row_avg(png_row_infop row_info, png_bytep row,
3829
    png_const_bytep prev_row)
3830 3831 3832 3833 3834 3835
{
   png_size_t i;
   png_bytep rp = row;
   png_const_bytep pp = prev_row;
   unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
   png_size_t istop = row_info->rowbytes - bpp;
3836

3837 3838
   for (i = 0; i < bpp; i++)
   {
3839 3840
      *rp = (png_byte)(((int)(*rp) +
         ((int)(*pp++) / 2 )) & 0xff);
3841

3842 3843
      rp++;
   }
3844

3845 3846
   for (i = 0; i < istop; i++)
   {
3847 3848
      *rp = (png_byte)(((int)(*rp) +
         (int)(*pp++ + *(rp-bpp)) / 2 ) & 0xff);
3849

3850 3851 3852 3853 3854
      rp++;
   }
}

static void
3855
png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row,
3856
    png_const_bytep prev_row)
3857
{
3858 3859
   png_bytep rp_end = row + row_info->rowbytes;
   int a, c;
3860

3861 3862 3863
   /* First pixel/byte */
   c = *prev_row++;
   a = *row + c;
3864
   *row++ = (png_byte)a;
3865

3866 3867
   /* Remainder */
   while (row < rp_end)
3868
   {
3869
      int b, pa, pb, pc, p;
3870

3871 3872
      a &= 0xff; /* From previous iteration or start */
      b = *prev_row++;
3873 3874 3875

      p = b - c;
      pc = a - c;
3876

3877 3878 3879 3880 3881 3882 3883 3884 3885
#ifdef PNG_USE_ABS
      pa = abs(p);
      pb = abs(pc);
      pc = abs(p + pc);
#else
      pa = p < 0 ? -p : p;
      pb = pc < 0 ? -pc : pc;
      pc = (p + pc) < 0 ? -(p + pc) : p + pc;
#endif
3886

3887 3888 3889 3890 3891
      /* Find the best predictor, the least of pa, pb, pc favoring the earlier
       * ones in the case of a tie.
       */
      if (pb < pa) pa = pb, a = b;
      if (pc < pa) a = c;
3892

3893 3894 3895 3896 3897
      /* Calculate the current pixel in a, and move the previous row pixel to c
       * for the next time round the loop
       */
      c = b;
      a += *row;
3898
      *row++ = (png_byte)a;
3899 3900
   }
}
3901

3902 3903
static void
png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
3904
    png_const_bytep prev_row)
3905
{
3906
   unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
3907
   png_bytep rp_end = row + bpp;
3908

3909 3910 3911 3912 3913 3914
   /* Process the first pixel in the row completely (this is the same as 'up'
    * because there is only one candidate predictor for the first row).
    */
   while (row < rp_end)
   {
      int a = *row + *prev_row++;
3915
      *row++ = (png_byte)a;
3916
   }
3917

3918
   /* Remainder */
3919
   rp_end = rp_end + (row_info->rowbytes - bpp);
3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931

   while (row < rp_end)
   {
      int a, b, c, pa, pb, pc, p;

      c = *(prev_row - bpp);
      a = *(row - bpp);
      b = *prev_row++;

      p = b - c;
      pc = a - c;

3932 3933 3934 3935 3936 3937 3938 3939 3940
#ifdef PNG_USE_ABS
      pa = abs(p);
      pb = abs(pc);
      pc = abs(p + pc);
#else
      pa = p < 0 ? -p : p;
      pb = pc < 0 ? -pc : pc;
      pc = (p + pc) < 0 ? -(p + pc) : p + pc;
#endif
3941 3942 3943 3944 3945

      if (pb < pa) pa = pb, a = b;
      if (pc < pa) a = c;

      a += *row;
3946
      *row++ = (png_byte)a;
3947 3948
   }
}
G
Guy Schalnat 已提交
3949

3950
static void
3951
png_init_filter_functions(png_structrp pp)
3952 3953
   /* This function is called once for every PNG image (except for PNG images
    * that only use PNG_FILTER_VALUE_NONE for all rows) to set the
3954 3955 3956 3957
    * implementations required to reverse the filtering of PNG rows.  Reversing
    * the filter is the first transformation performed on the row data.  It is
    * performed in place, therefore an implementation can be selected based on
    * the image pixel format.  If the implementation depends on image width then
3958
    * take care to ensure that it works correctly if the image is interlaced -
3959 3960
    * interlacing causes the actual row width to vary.
    */
3961
{
3962 3963
   unsigned int bpp = (pp->pixel_depth + 7) >> 3;

3964 3965 3966
   pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub;
   pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up;
   pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg;
3967 3968 3969 3970 3971 3972
   if (bpp == 1)
      pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
         png_read_filter_row_paeth_1byte_pixel;
   else
      pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
         png_read_filter_row_paeth_multibyte_pixel;
3973

3974 3975 3976 3977 3978 3979 3980 3981 3982 3983
#ifdef PNG_FILTER_OPTIMIZATIONS
   /* To use this define PNG_FILTER_OPTIMIZATIONS as the name of a function to
    * call to install hardware optimizations for the above functions; simply
    * replace whatever elements of the pp->read_filter[] array with a hardware
    * specific (or, for that matter, generic) optimization.
    *
    * To see an example of this examine what configure.ac does when
    * --enable-arm-neon is specified on the command line.
    */
   PNG_FILTER_OPTIMIZATIONS(pp, bpp);
3984 3985 3986 3987
#endif
}

void /* PRIVATE */
3988
png_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row,
3989
    png_const_bytep prev_row, int filter)
3990
{
3991 3992 3993 3994
   /* OPTIMIZATION: DO NOT MODIFY THIS FUNCTION, instead #define
    * PNG_FILTER_OPTIMIZATIONS to a function that overrides the generic
    * implementations.  See png_init_filter_functions above.
    */
3995
   if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST)
3996 3997 3998 3999
   {
      if (pp->read_filter[0] == NULL)
         png_init_filter_functions(pp);

4000
      pp->read_filter[filter-1](row_info, row, prev_row);
4001
   }
4002 4003
}

4004
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
4005 4006
void /* PRIVATE */
png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
4007
    png_alloc_size_t avail_out)
4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068
{
   /* Loop reading IDATs and decompressing the result into output[avail_out] */
   png_ptr->zstream.next_out = output;
   png_ptr->zstream.avail_out = 0; /* safety: set below */

   if (output == NULL)
      avail_out = 0;

   do
   {
      int ret;
      png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];

      if (png_ptr->zstream.avail_in == 0)
      {
         uInt avail_in;
         png_bytep buffer;

         while (png_ptr->idat_size == 0)
         {
            png_crc_finish(png_ptr, 0);

            png_ptr->idat_size = png_read_chunk_header(png_ptr);
            /* This is an error even in the 'check' case because the code just
             * consumed a non-IDAT header.
             */
            if (png_ptr->chunk_name != png_IDAT)
               png_error(png_ptr, "Not enough image data");
         }

         avail_in = png_ptr->IDAT_read_size;

         if (avail_in > png_ptr->idat_size)
            avail_in = (uInt)png_ptr->idat_size;

         /* A PNG with a gradually increasing IDAT size will defeat this attempt
          * to minimize memory usage by causing lots of re-allocs, but
          * realistically doing IDAT_read_size re-allocs is not likely to be a
          * big problem.
          */
         buffer = png_read_buffer(png_ptr, avail_in, 0/*error*/);

         png_crc_read(png_ptr, buffer, avail_in);
         png_ptr->idat_size -= avail_in;

         png_ptr->zstream.next_in = buffer;
         png_ptr->zstream.avail_in = avail_in;
      }

      /* And set up the output side. */
      if (output != NULL) /* standard read */
      {
         uInt out = ZLIB_IO_MAX;

         if (out > avail_out)
            out = (uInt)avail_out;

         avail_out -= out;
         png_ptr->zstream.avail_out = out;
      }

4069
      else /* after last row, checking for end */
4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081
      {
         png_ptr->zstream.next_out = tmpbuf;
         png_ptr->zstream.avail_out = (sizeof tmpbuf);
      }

      /* Use NO_FLUSH; this gives zlib the maximum opportunity to optimize the
       * process.  If the LZ stream is truncated the sequential reader will
       * terminally damage the stream, above, by reading the chunk header of the
       * following chunk (it then exits with png_error).
       *
       * TODO: deal more elegantly with truncated IDAT lists.
       */
4082
      ret = PNG_INFLATE(png_ptr, Z_NO_FLUSH);
4083

4084 4085 4086 4087 4088 4089 4090
      /* Take the unconsumed output back. */
      if (output != NULL)
         avail_out += png_ptr->zstream.avail_out;

      else /* avail_out counts the extra bytes */
         avail_out += (sizeof tmpbuf) - png_ptr->zstream.avail_out;

4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110
      png_ptr->zstream.avail_out = 0;

      if (ret == Z_STREAM_END)
      {
         /* Do this for safety; we won't read any more into this row. */
         png_ptr->zstream.next_out = NULL;

         png_ptr->mode |= PNG_AFTER_IDAT;
         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;

         if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0)
            png_chunk_benign_error(png_ptr, "Extra compressed data");
         break;
      }

      if (ret != Z_OK)
      {
         png_zstream_error(png_ptr, ret);

         if (output != NULL)
4111 4112 4113
         {
               png_chunk_error(png_ptr, png_ptr->zstream.msg);
         }
4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130

         else /* checking */
         {
            png_chunk_benign_error(png_ptr, png_ptr->zstream.msg);
            return;
         }
      }
   } while (avail_out > 0);

   if (avail_out > 0)
   {
      /* The stream ended before the image; this is the same as too few IDATs so
       * should be handled the same way.
       */
      if (output != NULL)
         png_error(png_ptr, "Not enough image data");

4131
      else /* the deflate stream contained extra data */
4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143
         png_chunk_benign_error(png_ptr, "Too much image data");
   }
}

void /* PRIVATE */
png_read_finish_IDAT(png_structrp png_ptr)
{
   /* We don't need any more data and the stream should have ended, however the
    * LZ end code may actually not have been processed.  In this case we must
    * read it otherwise stray unread IDAT data or, more likely, an IDAT chunk
    * may still remain to be consumed.
    */
4144
   if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155
   {
      /* The NULL causes png_read_IDAT_data to swallow any remaining bytes in
       * the compressed stream, but the stream may be damaged too, so even after
       * this call we may need to terminate the zstream ownership.
       */
      png_read_IDAT_data(png_ptr, NULL, 0);
      png_ptr->zstream.next_out = NULL; /* safety */

      /* Now clear everything out for safety; the following may not have been
       * done.
       */
4156
      if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183
      {
         png_ptr->mode |= PNG_AFTER_IDAT;
         png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
      }
   }

   /* If the zstream has not been released do it now *and* terminate the reading
    * of the final IDAT chunk.
    */
   if (png_ptr->zowner == png_IDAT)
   {
      /* Always do this; the pointers otherwise point into the read buffer. */
      png_ptr->zstream.next_in = NULL;
      png_ptr->zstream.avail_in = 0;

      /* Now we no longer own the zstream. */
      png_ptr->zowner = 0;

      /* The slightly weird semantics of the sequential IDAT reading is that we
       * are always in or at the end of an IDAT chunk, so we always need to do a
       * crc_finish here.  If idat_size is non-zero we also need to read the
       * spurious bytes at the end of the chunk now.
       */
      (void)png_crc_finish(png_ptr, png_ptr->idat_size);
   }
}

4184
void /* PRIVATE */
4185
png_read_finish_row(png_structrp png_ptr)
G
Guy Schalnat 已提交
4186
{
4187
   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
4188

4189
   /* Start of interlace block */
4190
   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
4191

4192
   /* Offset to next interlace block */
4193
   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
4194

4195
   /* Start of interlace block in the y direction */
4196
   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
4197

4198
   /* Offset to next interlace block in the y direction */
4199
   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
4200

4201
   png_debug(1, "in png_read_finish_row");
G
Guy Schalnat 已提交
4202 4203 4204 4205
   png_ptr->row_number++;
   if (png_ptr->row_number < png_ptr->num_rows)
      return;

4206
   if (png_ptr->interlaced != 0)
G
Guy Schalnat 已提交
4207 4208
   {
      png_ptr->row_number = 0;
4209

4210 4211 4212
      /* TO DO: don't do this if prev_row isn't needed (requires
       * read-ahead of the next row's filter byte.
       */
4213
      memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
4214

G
Guy Schalnat 已提交
4215 4216 4217
      do
      {
         png_ptr->pass++;
4218

G
Guy Schalnat 已提交
4219 4220
         if (png_ptr->pass >= 7)
            break;
4221

G
Guy Schalnat 已提交
4222 4223 4224 4225
         png_ptr->iwidth = (png_ptr->width +
            png_pass_inc[png_ptr->pass] - 1 -
            png_pass_start[png_ptr->pass]) /
            png_pass_inc[png_ptr->pass];
4226

4227
         if ((png_ptr->transformations & PNG_INTERLACE) == 0)
G
Guy Schalnat 已提交
4228 4229
         {
            png_ptr->num_rows = (png_ptr->height +
4230 4231 4232
                png_pass_yinc[png_ptr->pass] - 1 -
                png_pass_ystart[png_ptr->pass]) /
                png_pass_yinc[png_ptr->pass];
G
Guy Schalnat 已提交
4233
         }
4234

4235
         else  /* if (png_ptr->transformations & PNG_INTERLACE) */
4236 4237 4238
            break; /* libpng deinterlacing sees every row */

      } while (png_ptr->num_rows == 0 || png_ptr->iwidth == 0);
G
Guy Schalnat 已提交
4239 4240 4241 4242 4243

      if (png_ptr->pass < 7)
         return;
   }

4244 4245
   /* Here after at the end of the last row of the last pass. */
   png_read_finish_IDAT(png_ptr);
G
Guy Schalnat 已提交
4246
}
4247
#endif /* SEQUENTIAL_READ */
G
Guy Schalnat 已提交
4248

4249
void /* PRIVATE */
4250
png_read_start_row(png_structrp png_ptr)
G
Guy Schalnat 已提交
4251
{
4252
   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
4253

4254
   /* Start of interlace block */
4255
   static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
4256

4257
   /* Offset to next interlace block */
4258
   static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
4259

4260
   /* Start of interlace block in the y direction */
4261
   static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
4262

4263
   /* Offset to next interlace block in the y direction */
4264
   static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
4265

4266
   unsigned int max_pixel_depth;
4267
   png_size_t row_bytes;
G
Guy Schalnat 已提交
4268

4269
   png_debug(1, "in png_read_start_row");
4270

4271
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
G
Guy Schalnat 已提交
4272
   png_init_read_transformations(png_ptr);
4273
#endif
4274
   if (png_ptr->interlaced != 0)
G
Guy Schalnat 已提交
4275
   {
4276
      if ((png_ptr->transformations & PNG_INTERLACE) == 0)
G
Guy Schalnat 已提交
4277
         png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
4278 4279
             png_pass_ystart[0]) / png_pass_yinc[0];

G
Guy Schalnat 已提交
4280 4281 4282 4283
      else
         png_ptr->num_rows = png_ptr->height;

      png_ptr->iwidth = (png_ptr->width +
4284 4285 4286
          png_pass_inc[png_ptr->pass] - 1 -
          png_pass_start[png_ptr->pass]) /
          png_pass_inc[png_ptr->pass];
G
Guy Schalnat 已提交
4287
   }
4288

G
Guy Schalnat 已提交
4289 4290 4291 4292 4293
   else
   {
      png_ptr->num_rows = png_ptr->height;
      png_ptr->iwidth = png_ptr->width;
   }
4294

4295
   max_pixel_depth = (unsigned int)png_ptr->pixel_depth;
G
Guy Schalnat 已提交
4296

4297
   /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpler set of
4298 4299 4300 4301 4302 4303 4304 4305 4306
    * calculations to calculate the final pixel depth, then
    * png_do_read_transforms actually does the transforms.  This means that the
    * code which effectively calculates this value is actually repeated in three
    * separate places.  They must all match.  Innocent changes to the order of
    * transformations can and will break libpng in a way that causes memory
    * overwrites.
    *
    * TODO: fix this.
    */
4307
#ifdef PNG_READ_PACK_SUPPORTED
4308
   if ((png_ptr->transformations & PNG_PACK) != 0 && png_ptr->bit_depth < 8)
G
Guy Schalnat 已提交
4309
      max_pixel_depth = 8;
G
Guy Schalnat 已提交
4310
#endif
G
Guy Schalnat 已提交
4311

4312
#ifdef PNG_READ_EXPAND_SUPPORTED
4313
   if ((png_ptr->transformations & PNG_EXPAND) != 0)
G
Guy Schalnat 已提交
4314 4315 4316
   {
      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
      {
4317
         if (png_ptr->num_trans != 0)
G
Guy Schalnat 已提交
4318
            max_pixel_depth = 32;
4319

G
Guy Schalnat 已提交
4320 4321 4322
         else
            max_pixel_depth = 24;
      }
4323

G
Guy Schalnat 已提交
4324 4325 4326 4327
      else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
      {
         if (max_pixel_depth < 8)
            max_pixel_depth = 8;
4328

4329
         if (png_ptr->num_trans != 0)
G
Guy Schalnat 已提交
4330 4331
            max_pixel_depth *= 2;
      }
4332

G
Guy Schalnat 已提交
4333 4334
      else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
      {
4335
         if (png_ptr->num_trans != 0)
G
Guy Schalnat 已提交
4336 4337 4338 4339 4340 4341
         {
            max_pixel_depth *= 4;
            max_pixel_depth /= 3;
         }
      }
   }
G
Guy Schalnat 已提交
4342
#endif
G
Guy Schalnat 已提交
4343

4344
#ifdef PNG_READ_EXPAND_16_SUPPORTED
4345
   if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
4346
   {
4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358
#  ifdef PNG_READ_EXPAND_SUPPORTED
      /* In fact it is an error if it isn't supported, but checking is
       * the safe way.
       */
      if ((png_ptr->transformations & PNG_EXPAND) != 0)
      {
         if (png_ptr->bit_depth < 16)
            max_pixel_depth *= 2;
      }
      else
#  endif
      png_ptr->transformations &= ~PNG_EXPAND_16;
4359 4360 4361
   }
#endif

4362
#ifdef PNG_READ_FILLER_SUPPORTED
4363
   if ((png_ptr->transformations & (PNG_FILLER)) != 0)
G
Guy Schalnat 已提交
4364
   {
4365
      if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
4366 4367 4368
      {
         if (max_pixel_depth <= 8)
            max_pixel_depth = 16;
4369

4370 4371 4372
         else
            max_pixel_depth = 32;
      }
4373

4374 4375
      else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB ||
         png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
4376 4377 4378
      {
         if (max_pixel_depth <= 32)
            max_pixel_depth = 32;
4379

4380 4381 4382
         else
            max_pixel_depth = 64;
      }
G
Guy Schalnat 已提交
4383
   }
G
Guy Schalnat 已提交
4384
#endif
G
Guy Schalnat 已提交
4385

4386
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
4387
   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
G
Guy Schalnat 已提交
4388
   {
4389
      if (
4390
#ifdef PNG_READ_EXPAND_SUPPORTED
4391 4392
          (png_ptr->num_trans != 0 &&
          (png_ptr->transformations & PNG_EXPAND) != 0) ||
4393
#endif
4394
#ifdef PNG_READ_FILLER_SUPPORTED
4395
          (png_ptr->transformations & (PNG_FILLER)) != 0 ||
4396
#endif
4397
          png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
G
Guy Schalnat 已提交
4398 4399 4400
      {
         if (max_pixel_depth <= 16)
            max_pixel_depth = 32;
4401

4402
         else
G
Guy Schalnat 已提交
4403 4404
            max_pixel_depth = 64;
      }
4405

G
Guy Schalnat 已提交
4406 4407 4408
      else
      {
         if (max_pixel_depth <= 8)
4409 4410
         {
            if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
4411
               max_pixel_depth = 32;
4412 4413

            else
4414
               max_pixel_depth = 24;
4415 4416
         }

4417 4418
         else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
            max_pixel_depth = 64;
4419

4420
         else
G
Guy Schalnat 已提交
4421 4422 4423
            max_pixel_depth = 48;
      }
   }
G
Guy Schalnat 已提交
4424
#endif
G
Guy Schalnat 已提交
4425

4426 4427
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \
defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
4428
   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
4429
   {
4430
      unsigned int user_pixel_depth = png_ptr->user_transform_depth *
4431
         png_ptr->user_transform_channels;
4432 4433

      if (user_pixel_depth > max_pixel_depth)
4434
         max_pixel_depth = user_pixel_depth;
4435
   }
4436 4437
#endif

4438 4439 4440
   /* This value is stored in png_struct and double checked in the row read
    * code.
    */
4441
   png_ptr->maximum_pixel_depth = (png_byte)max_pixel_depth;
4442 4443
   png_ptr->transformed_pixel_depth = 0; /* calculated on demand */

4444 4445 4446
   /* Align the width on the next larger 8 pixels.  Mainly used
    * for interlacing
    */
4447
   row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7));
4448 4449 4450
   /* Calculate the maximum bytes needed, adding a byte and a pixel
    * for safety's sake
    */
4451
   row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) +
4452
       1 + ((max_pixel_depth + 7) >> 3U);
4453

G
Guy Schalnat 已提交
4454
#ifdef PNG_MAX_MALLOC_64K
4455
   if (row_bytes > (png_uint_32)65536L)
G
Guy Schalnat 已提交
4456
      png_error(png_ptr, "This image requires a row greater than 64KB");
G
Guy Schalnat 已提交
4457
#endif
4458

4459
   if (row_bytes + 48 > png_ptr->old_big_row_buf_size)
4460
   {
4461 4462
      png_free(png_ptr, png_ptr->big_row_buf);
      png_free(png_ptr, png_ptr->big_prev_row);
4463

4464 4465 4466
      if (png_ptr->interlaced != 0)
         png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
             row_bytes + 48);
4467

4468 4469
      else
         png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
4470

4471
      png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48);
4472 4473

#ifdef PNG_ALIGNED_MEMORY_SUPPORTED
4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489
      /* Use 16-byte aligned memory for row_buf with at least 16 bytes
       * of padding before and after row_buf; treat prev_row similarly.
       * NOTE: the alignment is to the start of the pixels, one beyond the start
       * of the buffer, because of the filter byte.  Prior to libpng 1.5.6 this
       * was incorrect; the filter byte was aligned, which had the exact
       * opposite effect of that intended.
       */
      {
         png_bytep temp = png_ptr->big_row_buf + 32;
         int extra = (int)((temp - (png_bytep)0) & 0x0f);
         png_ptr->row_buf = temp - extra - 1/*filter byte*/;

         temp = png_ptr->big_prev_row + 32;
         extra = (int)((temp - (png_bytep)0) & 0x0f);
         png_ptr->prev_row = temp - extra - 1/*filter byte*/;
      }
4490

4491
#else
4492 4493 4494
      /* Use 31 bytes of padding before and 17 bytes after row_buf. */
      png_ptr->row_buf = png_ptr->big_row_buf + 31;
      png_ptr->prev_row = png_ptr->big_prev_row + 31;
4495
#endif
4496
      png_ptr->old_big_row_buf_size = row_bytes + 48;
4497
   }
G
Guy Schalnat 已提交
4498 4499

#ifdef PNG_MAX_MALLOC_64K
4500
   if (png_ptr->rowbytes > 65535)
G
Guy Schalnat 已提交
4501
      png_error(png_ptr, "This image requires a row greater than 64KB");
4502

G
Guy Schalnat 已提交
4503
#endif
4504
   if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1))
4505
      png_error(png_ptr, "Row has too many bytes to allocate in memory");
4506

4507
   memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
G
Guy Schalnat 已提交
4508

4509 4510 4511 4512
   png_debug1(3, "width = %u,", png_ptr->width);
   png_debug1(3, "height = %u,", png_ptr->height);
   png_debug1(3, "iwidth = %u,", png_ptr->iwidth);
   png_debug1(3, "num_rows = %u,", png_ptr->num_rows);
4513 4514
   png_debug1(3, "rowbytes = %lu,", (unsigned long)png_ptr->rowbytes);
   png_debug1(3, "irowbytes = %lu",
4515
       (unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1);
G
Guy Schalnat 已提交
4516

4517 4518 4519 4520
   /* The sequential reader needs a buffer for IDAT, but the progressive reader
    * does not, so free the read buffer now regardless; the sequential reader
    * reallocates it on demand.
    */
4521
   if (png_ptr->read_buffer != NULL)
4522 4523 4524 4525 4526 4527 4528 4529
   {
      png_bytep buffer = png_ptr->read_buffer;

      png_ptr->read_buffer_size = 0;
      png_ptr->read_buffer = NULL;
      png_free(png_ptr, buffer);
   }

4530 4531 4532 4533
   /* Finally claim the zstream for the inflate of the IDAT data, use the bits
    * value from the stream (note that this will result in a fatal error if the
    * IDAT stream has a bogus deflate header window_bits value, but this should
    * not be happening any longer!)
4534
    */
4535 4536
   if (png_inflate_claim(png_ptr, png_IDAT) != Z_OK)
      png_error(png_ptr, png_ptr->zstream.msg);
4537

G
Guy Schalnat 已提交
4538
   png_ptr->flags |= PNG_FLAG_ROW_INIT;
G
Guy Schalnat 已提交
4539
}
4540
#endif /* READ */