1 2 /* pngpread.c - read a png file in push mode 3 * 4 * Last changed in libpng 1.5.11 [June 14, 2012] 5 * Copyright (c) 1998-2012 Glenn Randers-Pehrson 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7 * (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 14 #include "pngpriv.h" 15 16 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED 17 18 /* Push model modes */ 19 #define PNG_READ_SIG_MODE 0 20 #define PNG_READ_CHUNK_MODE 1 21 #define PNG_READ_IDAT_MODE 2 22 #define PNG_SKIP_MODE 3 23 #define PNG_READ_tEXt_MODE 4 24 #define PNG_READ_zTXt_MODE 5 25 #define PNG_READ_DONE_MODE 6 26 #define PNG_READ_iTXt_MODE 7 27 #define PNG_ERROR_MODE 8 28 29 void PNGAPI 30 png_process_data(png_structp png_ptr, png_infop info_ptr, 31 png_bytep buffer, png_size_t buffer_size) 32 { 33 if (png_ptr == NULL || info_ptr == NULL) 34 return; 35 36 png_push_restore_buffer(png_ptr, buffer, buffer_size); 37 38 while (png_ptr->buffer_size) 39 { 40 png_process_some_data(png_ptr, info_ptr); 41 } 42 } 43 44 png_size_t PNGAPI 45 png_process_data_pause(png_structp png_ptr, int save) 46 { 47 if (png_ptr != NULL) 48 { 49 /* It's easiest for the caller if we do the save, then the caller doesn't 50 * have to supply the same data again: 51 */ 52 if (save) 53 png_push_save_buffer(png_ptr); 54 else 55 { 56 /* This includes any pending saved bytes: */ 57 png_size_t remaining = png_ptr->buffer_size; 58 png_ptr->buffer_size = 0; 59 60 /* So subtract the saved buffer size, unless all the data 61 * is actually 'saved', in which case we just return 0 62 */ 63 if (png_ptr->save_buffer_size < remaining) 64 return remaining - png_ptr->save_buffer_size; 65 } 66 } 67 68 return 0; 69 } 70 71 png_uint_32 PNGAPI 72 png_process_data_skip(png_structp png_ptr) 73 { 74 png_uint_32 remaining = 0; 75 76 if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE && 77 png_ptr->skip_length > 0) 78 { 79 /* At the end of png_process_data the buffer size must be 0 (see the loop 80 * above) so we can detect a broken call here: 81 */ 82 if (png_ptr->buffer_size != 0) 83 png_error(png_ptr, 84 "png_process_data_skip called inside png_process_data"); 85 86 /* If is impossible for there to be a saved buffer at this point - 87 * otherwise we could not be in SKIP mode. This will also happen if 88 * png_process_skip is called inside png_process_data (but only very 89 * rarely.) 90 */ 91 if (png_ptr->save_buffer_size != 0) 92 png_error(png_ptr, "png_process_data_skip called with saved data"); 93 94 remaining = png_ptr->skip_length; 95 png_ptr->skip_length = 0; 96 png_ptr->process_mode = PNG_READ_CHUNK_MODE; 97 } 98 99 return remaining; 100 } 101 102 /* What we do with the incoming data depends on what we were previously 103 * doing before we ran out of data... 104 */ 105 void /* PRIVATE */ 106 png_process_some_data(png_structp png_ptr, png_infop info_ptr) 107 { 108 if (png_ptr == NULL) 109 return; 110 111 switch (png_ptr->process_mode) 112 { 113 case PNG_READ_SIG_MODE: 114 { 115 png_push_read_sig(png_ptr, info_ptr); 116 break; 117 } 118 119 case PNG_READ_CHUNK_MODE: 120 { 121 png_push_read_chunk(png_ptr, info_ptr); 122 break; 123 } 124 125 case PNG_READ_IDAT_MODE: 126 { 127 png_push_read_IDAT(png_ptr); 128 break; 129 } 130 131 case PNG_SKIP_MODE: 132 { 133 png_push_crc_finish(png_ptr); 134 break; 135 } 136 137 default: 138 { 139 png_ptr->buffer_size = 0; 140 break; 141 } 142 } 143 } 144 145 /* Read any remaining signature bytes from the stream and compare them with 146 * the correct PNG signature. It is possible that this routine is called 147 * with bytes already read from the signature, either because they have been 148 * checked by the calling application, or because of multiple calls to this 149 * routine. 150 */ 151 void /* PRIVATE */ 152 png_push_read_sig(png_structp png_ptr, png_infop info_ptr) 153 { 154 png_size_t num_checked = png_ptr->sig_bytes, 155 num_to_check = 8 - num_checked; 156 157 if (png_ptr->buffer_size < num_to_check) 158 { 159 num_to_check = png_ptr->buffer_size; 160 } 161 162 png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), 163 num_to_check); 164 png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); 165 166 if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) 167 { 168 if (num_checked < 4 && 169 png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) 170 png_error(png_ptr, "Not a PNG file"); 171 172 else 173 png_error(png_ptr, "PNG file corrupted by ASCII conversion"); 174 } 175 176 else 177 { 178 if (png_ptr->sig_bytes >= 8) 179 { 180 png_ptr->process_mode = PNG_READ_CHUNK_MODE; 181 } 182 } 183 } 184 185 void /* PRIVATE */ 186 png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) 187 { 188 png_uint_32 chunk_name; 189 190 /* First we make sure we have enough data for the 4 byte chunk name 191 * and the 4 byte chunk length before proceeding with decoding the 192 * chunk data. To fully decode each of these chunks, we also make 193 * sure we have enough data in the buffer for the 4 byte CRC at the 194 * end of every chunk (except IDAT, which is handled separately). 195 */ 196 if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 197 { 198 png_byte chunk_length[4]; 199 png_byte chunk_tag[4]; 200 201 if (png_ptr->buffer_size < 8) 202 { 203 png_push_save_buffer(png_ptr); 204 return; 205 } 206 207 png_push_fill_buffer(png_ptr, chunk_length, 4); 208 png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 209 png_reset_crc(png_ptr); 210 png_crc_read(png_ptr, chunk_tag, 4); 211 png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); 212 png_check_chunk_name(png_ptr, png_ptr->chunk_name); 213 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 214 } 215 216 chunk_name = png_ptr->chunk_name; 217 218 if (chunk_name == png_IDAT) 219 { 220 /* This is here above the if/else case statement below because if the 221 * unknown handling marks 'IDAT' as unknown then the IDAT handling case is 222 * completely skipped. 223 * 224 * TODO: there must be a better way of doing this. 225 */ 226 if (png_ptr->mode & PNG_AFTER_IDAT) 227 png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; 228 } 229 230 if (chunk_name == png_IHDR) 231 { 232 if (png_ptr->push_length != 13) 233 png_error(png_ptr, "Invalid IHDR length"); 234 235 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 236 { 237 png_push_save_buffer(png_ptr); 238 return; 239 } 240 241 png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); 242 } 243 244 else if (chunk_name == png_IEND) 245 { 246 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 247 { 248 png_push_save_buffer(png_ptr); 249 return; 250 } 251 252 png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); 253 254 png_ptr->process_mode = PNG_READ_DONE_MODE; 255 png_push_have_end(png_ptr, info_ptr); 256 } 257 258 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 259 else if (png_chunk_unknown_handling(png_ptr, chunk_name)) 260 { 261 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 262 { 263 png_push_save_buffer(png_ptr); 264 return; 265 } 266 267 if (chunk_name == png_IDAT) 268 png_ptr->mode |= PNG_HAVE_IDAT; 269 270 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 271 272 if (chunk_name == png_PLTE) 273 png_ptr->mode |= PNG_HAVE_PLTE; 274 275 else if (chunk_name == png_IDAT) 276 { 277 if (!(png_ptr->mode & PNG_HAVE_IHDR)) 278 png_error(png_ptr, "Missing IHDR before IDAT"); 279 280 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 281 !(png_ptr->mode & PNG_HAVE_PLTE)) 282 png_error(png_ptr, "Missing PLTE before IDAT"); 283 } 284 } 285 #endif 286 287 else if (chunk_name == png_PLTE) 288 { 289 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 290 { 291 png_push_save_buffer(png_ptr); 292 return; 293 } 294 png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); 295 } 296 297 else if (chunk_name == png_IDAT) 298 { 299 /* If we reach an IDAT chunk, this means we have read all of the 300 * header chunks, and we can start reading the image (or if this 301 * is called after the image has been read - we have an error). 302 */ 303 304 if (!(png_ptr->mode & PNG_HAVE_IHDR)) 305 png_error(png_ptr, "Missing IHDR before IDAT"); 306 307 else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && 308 !(png_ptr->mode & PNG_HAVE_PLTE)) 309 png_error(png_ptr, "Missing PLTE before IDAT"); 310 311 if (png_ptr->mode & PNG_HAVE_IDAT) 312 { 313 if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) 314 if (png_ptr->push_length == 0) 315 return; 316 317 if (png_ptr->mode & PNG_AFTER_IDAT) 318 png_benign_error(png_ptr, "Too many IDATs found"); 319 } 320 321 png_ptr->idat_size = png_ptr->push_length; 322 png_ptr->mode |= PNG_HAVE_IDAT; 323 png_ptr->process_mode = PNG_READ_IDAT_MODE; 324 png_push_have_info(png_ptr, info_ptr); 325 png_ptr->zstream.avail_out = 326 (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 327 png_ptr->iwidth) + 1; 328 png_ptr->zstream.next_out = png_ptr->row_buf; 329 return; 330 } 331 332 #ifdef PNG_READ_gAMA_SUPPORTED 333 else if (png_ptr->chunk_name == png_gAMA) 334 { 335 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 336 { 337 png_push_save_buffer(png_ptr); 338 return; 339 } 340 341 png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); 342 } 343 344 #endif 345 #ifdef PNG_READ_sBIT_SUPPORTED 346 else if (png_ptr->chunk_name == png_sBIT) 347 { 348 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 349 { 350 png_push_save_buffer(png_ptr); 351 return; 352 } 353 354 png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); 355 } 356 357 #endif 358 #ifdef PNG_READ_cHRM_SUPPORTED 359 else if (png_ptr->chunk_name == png_cHRM) 360 { 361 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 362 { 363 png_push_save_buffer(png_ptr); 364 return; 365 } 366 367 png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); 368 } 369 370 #endif 371 #ifdef PNG_READ_sRGB_SUPPORTED 372 else if (chunk_name == png_sRGB) 373 { 374 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 375 { 376 png_push_save_buffer(png_ptr); 377 return; 378 } 379 380 png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); 381 } 382 383 #endif 384 #ifdef PNG_READ_iCCP_SUPPORTED 385 else if (png_ptr->chunk_name == png_iCCP) 386 { 387 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 388 { 389 png_push_save_buffer(png_ptr); 390 return; 391 } 392 393 png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); 394 } 395 396 #endif 397 #ifdef PNG_READ_sPLT_SUPPORTED 398 else if (chunk_name == png_sPLT) 399 { 400 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 401 { 402 png_push_save_buffer(png_ptr); 403 return; 404 } 405 406 png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); 407 } 408 409 #endif 410 #ifdef PNG_READ_tRNS_SUPPORTED 411 else if (chunk_name == png_tRNS) 412 { 413 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 414 { 415 png_push_save_buffer(png_ptr); 416 return; 417 } 418 419 png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); 420 } 421 422 #endif 423 #ifdef PNG_READ_bKGD_SUPPORTED 424 else if (chunk_name == png_bKGD) 425 { 426 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 427 { 428 png_push_save_buffer(png_ptr); 429 return; 430 } 431 432 png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); 433 } 434 435 #endif 436 #ifdef PNG_READ_hIST_SUPPORTED 437 else if (chunk_name == png_hIST) 438 { 439 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 440 { 441 png_push_save_buffer(png_ptr); 442 return; 443 } 444 445 png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); 446 } 447 448 #endif 449 #ifdef PNG_READ_pHYs_SUPPORTED 450 else if (chunk_name == png_pHYs) 451 { 452 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 453 { 454 png_push_save_buffer(png_ptr); 455 return; 456 } 457 458 png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); 459 } 460 461 #endif 462 #ifdef PNG_READ_oFFs_SUPPORTED 463 else if (chunk_name == png_oFFs) 464 { 465 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 466 { 467 png_push_save_buffer(png_ptr); 468 return; 469 } 470 471 png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); 472 } 473 #endif 474 475 #ifdef PNG_READ_pCAL_SUPPORTED 476 else if (chunk_name == png_pCAL) 477 { 478 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 479 { 480 png_push_save_buffer(png_ptr); 481 return; 482 } 483 484 png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); 485 } 486 487 #endif 488 #ifdef PNG_READ_sCAL_SUPPORTED 489 else if (chunk_name == png_sCAL) 490 { 491 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 492 { 493 png_push_save_buffer(png_ptr); 494 return; 495 } 496 497 png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); 498 } 499 500 #endif 501 #ifdef PNG_READ_tIME_SUPPORTED 502 else if (chunk_name == png_tIME) 503 { 504 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 505 { 506 png_push_save_buffer(png_ptr); 507 return; 508 } 509 510 png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); 511 } 512 513 #endif 514 #ifdef PNG_READ_tEXt_SUPPORTED 515 else if (chunk_name == png_tEXt) 516 { 517 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 518 { 519 png_push_save_buffer(png_ptr); 520 return; 521 } 522 523 png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); 524 } 525 526 #endif 527 #ifdef PNG_READ_zTXt_SUPPORTED 528 else if (chunk_name == png_zTXt) 529 { 530 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 531 { 532 png_push_save_buffer(png_ptr); 533 return; 534 } 535 536 png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); 537 } 538 539 #endif 540 #ifdef PNG_READ_iTXt_SUPPORTED 541 else if (chunk_name == png_iTXt) 542 { 543 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 544 { 545 png_push_save_buffer(png_ptr); 546 return; 547 } 548 549 png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); 550 } 551 552 #endif 553 554 else 555 { 556 if (png_ptr->push_length + 4 > png_ptr->buffer_size) 557 { 558 png_push_save_buffer(png_ptr); 559 return; 560 } 561 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); 562 } 563 564 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 565 } 566 567 void /* PRIVATE */ 568 png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) 569 { 570 png_ptr->process_mode = PNG_SKIP_MODE; 571 png_ptr->skip_length = skip; 572 } 573 574 void /* PRIVATE */ 575 png_push_crc_finish(png_structp png_ptr) 576 { 577 if (png_ptr->skip_length && png_ptr->save_buffer_size) 578 { 579 png_size_t save_size = png_ptr->save_buffer_size; 580 png_uint_32 skip_length = png_ptr->skip_length; 581 582 /* We want the smaller of 'skip_length' and 'save_buffer_size', but 583 * they are of different types and we don't know which variable has the 584 * fewest bits. Carefully select the smaller and cast it to the type of 585 * the larger - this cannot overflow. Do not cast in the following test 586 * - it will break on either 16 or 64 bit platforms. 587 */ 588 if (skip_length < save_size) 589 save_size = (png_size_t)skip_length; 590 591 else 592 skip_length = (png_uint_32)save_size; 593 594 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 595 596 png_ptr->skip_length -= skip_length; 597 png_ptr->buffer_size -= save_size; 598 png_ptr->save_buffer_size -= save_size; 599 png_ptr->save_buffer_ptr += save_size; 600 } 601 602 if (png_ptr->skip_length && png_ptr->current_buffer_size) 603 { 604 png_size_t save_size = png_ptr->current_buffer_size; 605 png_uint_32 skip_length = png_ptr->skip_length; 606 607 /* We want the smaller of 'skip_length' and 'current_buffer_size', here, 608 * the same problem exists as above and the same solution. 609 */ 610 if (skip_length < save_size) 611 save_size = (png_size_t)skip_length; 612 613 else 614 skip_length = (png_uint_32)save_size; 615 616 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 617 618 png_ptr->skip_length -= skip_length; 619 png_ptr->buffer_size -= save_size; 620 png_ptr->current_buffer_size -= save_size; 621 png_ptr->current_buffer_ptr += save_size; 622 } 623 624 if (!png_ptr->skip_length) 625 { 626 if (png_ptr->buffer_size < 4) 627 { 628 png_push_save_buffer(png_ptr); 629 return; 630 } 631 632 png_crc_finish(png_ptr, 0); 633 png_ptr->process_mode = PNG_READ_CHUNK_MODE; 634 } 635 } 636 637 void PNGCBAPI 638 png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) 639 { 640 png_bytep ptr; 641 642 if (png_ptr == NULL) 643 return; 644 645 ptr = buffer; 646 647 if (png_ptr->save_buffer_size) 648 { 649 png_size_t save_size; 650 651 if (length < png_ptr->save_buffer_size) 652 save_size = length; 653 654 else 655 save_size = png_ptr->save_buffer_size; 656 657 png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); 658 length -= save_size; 659 ptr += save_size; 660 png_ptr->buffer_size -= save_size; 661 png_ptr->save_buffer_size -= save_size; 662 png_ptr->save_buffer_ptr += save_size; 663 } 664 665 if (length && png_ptr->current_buffer_size) 666 { 667 png_size_t save_size; 668 669 if (length < png_ptr->current_buffer_size) 670 save_size = length; 671 672 else 673 save_size = png_ptr->current_buffer_size; 674 675 png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); 676 png_ptr->buffer_size -= save_size; 677 png_ptr->current_buffer_size -= save_size; 678 png_ptr->current_buffer_ptr += save_size; 679 } 680 } 681 682 void /* PRIVATE */ 683 png_push_save_buffer(png_structp png_ptr) 684 { 685 if (png_ptr->save_buffer_size) 686 { 687 if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) 688 { 689 png_size_t i, istop; 690 png_bytep sp; 691 png_bytep dp; 692 693 istop = png_ptr->save_buffer_size; 694 695 for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; 696 i < istop; i++, sp++, dp++) 697 { 698 *dp = *sp; 699 } 700 } 701 } 702 703 if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > 704 png_ptr->save_buffer_max) 705 { 706 png_size_t new_max; 707 png_bytep old_buffer; 708 709 if (png_ptr->save_buffer_size > PNG_SIZE_MAX - 710 (png_ptr->current_buffer_size + 256)) 711 { 712 png_error(png_ptr, "Potential overflow of save_buffer"); 713 } 714 715 new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; 716 old_buffer = png_ptr->save_buffer; 717 png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, new_max); 718 719 if (png_ptr->save_buffer == NULL) 720 { 721 png_free(png_ptr, old_buffer); 722 png_error(png_ptr, "Insufficient memory for save_buffer"); 723 } 724 725 png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); 726 png_free(png_ptr, old_buffer); 727 png_ptr->save_buffer_max = new_max; 728 } 729 730 if (png_ptr->current_buffer_size) 731 { 732 png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, 733 png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); 734 png_ptr->save_buffer_size += png_ptr->current_buffer_size; 735 png_ptr->current_buffer_size = 0; 736 } 737 738 png_ptr->save_buffer_ptr = png_ptr->save_buffer; 739 png_ptr->buffer_size = 0; 740 } 741 742 void /* PRIVATE */ 743 png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, 744 png_size_t buffer_length) 745 { 746 png_ptr->current_buffer = buffer; 747 png_ptr->current_buffer_size = buffer_length; 748 png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; 749 png_ptr->current_buffer_ptr = png_ptr->current_buffer; 750 } 751 752 void /* PRIVATE */ 753 png_push_read_IDAT(png_structp png_ptr) 754 { 755 if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) 756 { 757 png_byte chunk_length[4]; 758 png_byte chunk_tag[4]; 759 760 /* TODO: this code can be commoned up with the same code in push_read */ 761 if (png_ptr->buffer_size < 8) 762 { 763 png_push_save_buffer(png_ptr); 764 return; 765 } 766 767 png_push_fill_buffer(png_ptr, chunk_length, 4); 768 png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); 769 png_reset_crc(png_ptr); 770 png_crc_read(png_ptr, chunk_tag, 4); 771 png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); 772 png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; 773 774 if (png_ptr->chunk_name != png_IDAT) 775 { 776 png_ptr->process_mode = PNG_READ_CHUNK_MODE; 777 778 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 779 png_error(png_ptr, "Not enough compressed data"); 780 781 return; 782 } 783 784 png_ptr->idat_size = png_ptr->push_length; 785 } 786 787 if (png_ptr->idat_size && png_ptr->save_buffer_size) 788 { 789 png_size_t save_size = png_ptr->save_buffer_size; 790 png_uint_32 idat_size = png_ptr->idat_size; 791 792 /* We want the smaller of 'idat_size' and 'current_buffer_size', but they 793 * are of different types and we don't know which variable has the fewest 794 * bits. Carefully select the smaller and cast it to the type of the 795 * larger - this cannot overflow. Do not cast in the following test - it 796 * will break on either 16 or 64 bit platforms. 797 */ 798 if (idat_size < save_size) 799 save_size = (png_size_t)idat_size; 800 801 else 802 idat_size = (png_uint_32)save_size; 803 804 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 805 806 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); 807 808 png_ptr->idat_size -= idat_size; 809 png_ptr->buffer_size -= save_size; 810 png_ptr->save_buffer_size -= save_size; 811 png_ptr->save_buffer_ptr += save_size; 812 } 813 814 if (png_ptr->idat_size && png_ptr->current_buffer_size) 815 { 816 png_size_t save_size = png_ptr->current_buffer_size; 817 png_uint_32 idat_size = png_ptr->idat_size; 818 819 /* We want the smaller of 'idat_size' and 'current_buffer_size', but they 820 * are of different types and we don't know which variable has the fewest 821 * bits. Carefully select the smaller and cast it to the type of the 822 * larger - this cannot overflow. 823 */ 824 if (idat_size < save_size) 825 save_size = (png_size_t)idat_size; 826 827 else 828 idat_size = (png_uint_32)save_size; 829 830 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 831 832 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); 833 834 png_ptr->idat_size -= idat_size; 835 png_ptr->buffer_size -= save_size; 836 png_ptr->current_buffer_size -= save_size; 837 png_ptr->current_buffer_ptr += save_size; 838 } 839 840 if (!png_ptr->idat_size) 841 { 842 if (png_ptr->buffer_size < 4) 843 { 844 png_push_save_buffer(png_ptr); 845 return; 846 } 847 848 png_crc_finish(png_ptr, 0); 849 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 850 png_ptr->mode |= PNG_AFTER_IDAT; 851 } 852 } 853 854 void /* PRIVATE */ 855 png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 856 png_size_t buffer_length) 857 { 858 /* The caller checks for a non-zero buffer length. */ 859 if (!(buffer_length > 0) || buffer == NULL) 860 png_error(png_ptr, "No IDAT data (internal error)"); 861 862 /* This routine must process all the data it has been given 863 * before returning, calling the row callback as required to 864 * handle the uncompressed results. 865 */ 866 png_ptr->zstream.next_in = buffer; 867 png_ptr->zstream.avail_in = (uInt)buffer_length; 868 869 /* Keep going until the decompressed data is all processed 870 * or the stream marked as finished. 871 */ 872 while (png_ptr->zstream.avail_in > 0 && 873 !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 874 { 875 int ret; 876 877 /* We have data for zlib, but we must check that zlib 878 * has someplace to put the results. It doesn't matter 879 * if we don't expect any results -- it may be the input 880 * data is just the LZ end code. 881 */ 882 if (!(png_ptr->zstream.avail_out > 0)) 883 { 884 png_ptr->zstream.avail_out = 885 (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 886 png_ptr->iwidth) + 1; 887 888 png_ptr->zstream.next_out = png_ptr->row_buf; 889 } 890 891 /* Using Z_SYNC_FLUSH here means that an unterminated 892 * LZ stream (a stream with a missing end code) can still 893 * be handled, otherwise (Z_NO_FLUSH) a future zlib 894 * implementation might defer output and therefore 895 * change the current behavior (see comments in inflate.c 896 * for why this doesn't happen at present with zlib 1.2.5). 897 */ 898 ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); 899 900 /* Check for any failure before proceeding. */ 901 if (ret != Z_OK && ret != Z_STREAM_END) 902 { 903 /* Terminate the decompression. */ 904 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 905 906 /* This may be a truncated stream (missing or 907 * damaged end code). Treat that as a warning. 908 */ 909 if (png_ptr->row_number >= png_ptr->num_rows || 910 png_ptr->pass > 6) 911 png_warning(png_ptr, "Truncated compressed data in IDAT"); 912 913 else 914 png_error(png_ptr, "Decompression error in IDAT"); 915 916 /* Skip the check on unprocessed input */ 917 return; 918 } 919 920 /* Did inflate output any data? */ 921 if (png_ptr->zstream.next_out != png_ptr->row_buf) 922 { 923 /* Is this unexpected data after the last row? 924 * If it is, artificially terminate the LZ output 925 * here. 926 */ 927 if (png_ptr->row_number >= png_ptr->num_rows || 928 png_ptr->pass > 6) 929 { 930 /* Extra data. */ 931 png_warning(png_ptr, "Extra compressed data in IDAT"); 932 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 933 934 /* Do no more processing; skip the unprocessed 935 * input check below. 936 */ 937 return; 938 } 939 940 /* Do we have a complete row? */ 941 if (png_ptr->zstream.avail_out == 0) 942 png_push_process_row(png_ptr); 943 } 944 945 /* And check for the end of the stream. */ 946 if (ret == Z_STREAM_END) 947 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; 948 } 949 950 /* All the data should have been processed, if anything 951 * is left at this point we have bytes of IDAT data 952 * after the zlib end code. 953 */ 954 if (png_ptr->zstream.avail_in > 0) 955 png_warning(png_ptr, "Extra compression data in IDAT"); 956 } 957 958 void /* PRIVATE */ 959 png_push_process_row(png_structp png_ptr) 960 { 961 /* 1.5.6: row_info moved out of png_struct to a local here. */ 962 png_row_info row_info; 963 964 row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */ 965 row_info.color_type = png_ptr->color_type; 966 row_info.bit_depth = png_ptr->bit_depth; 967 row_info.channels = png_ptr->channels; 968 row_info.pixel_depth = png_ptr->pixel_depth; 969 row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width); 970 971 if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE) 972 { 973 if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST) 974 png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1, 975 png_ptr->prev_row + 1, png_ptr->row_buf[0]); 976 else 977 png_error(png_ptr, "bad adaptive filter value"); 978 } 979 980 /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before 981 * 1.5.6, while the buffer really is this big in current versions of libpng 982 * it may not be in the future, so this was changed just to copy the 983 * interlaced row count: 984 */ 985 png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1); 986 987 #ifdef PNG_READ_TRANSFORMS_SUPPORTED 988 if (png_ptr->transformations) 989 png_do_read_transformations(png_ptr, &row_info); 990 #endif 991 992 /* The transformed pixel depth should match the depth now in row_info. */ 993 if (png_ptr->transformed_pixel_depth == 0) 994 { 995 png_ptr->transformed_pixel_depth = row_info.pixel_depth; 996 if (row_info.pixel_depth > png_ptr->maximum_pixel_depth) 997 png_error(png_ptr, "progressive row overflow"); 998 } 999 1000 else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth) 1001 png_error(png_ptr, "internal progressive row size calculation error"); 1002 1003 1004 #ifdef PNG_READ_INTERLACING_SUPPORTED 1005 /* Blow up interlaced rows to full size */ 1006 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 1007 { 1008 if (png_ptr->pass < 6) 1009 png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, 1010 png_ptr->transformations); 1011 1012 switch (png_ptr->pass) 1013 { 1014 case 0: 1015 { 1016 int i; 1017 for (i = 0; i < 8 && png_ptr->pass == 0; i++) 1018 { 1019 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1020 png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ 1021 } 1022 1023 if (png_ptr->pass == 2) /* Pass 1 might be empty */ 1024 { 1025 for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1026 { 1027 png_push_have_row(png_ptr, NULL); 1028 png_read_push_finish_row(png_ptr); 1029 } 1030 } 1031 1032 if (png_ptr->pass == 4 && png_ptr->height <= 4) 1033 { 1034 for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1035 { 1036 png_push_have_row(png_ptr, NULL); 1037 png_read_push_finish_row(png_ptr); 1038 } 1039 } 1040 1041 if (png_ptr->pass == 6 && png_ptr->height <= 4) 1042 { 1043 png_push_have_row(png_ptr, NULL); 1044 png_read_push_finish_row(png_ptr); 1045 } 1046 1047 break; 1048 } 1049 1050 case 1: 1051 { 1052 int i; 1053 for (i = 0; i < 8 && png_ptr->pass == 1; i++) 1054 { 1055 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1056 png_read_push_finish_row(png_ptr); 1057 } 1058 1059 if (png_ptr->pass == 2) /* Skip top 4 generated rows */ 1060 { 1061 for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1062 { 1063 png_push_have_row(png_ptr, NULL); 1064 png_read_push_finish_row(png_ptr); 1065 } 1066 } 1067 1068 break; 1069 } 1070 1071 case 2: 1072 { 1073 int i; 1074 1075 for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1076 { 1077 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1078 png_read_push_finish_row(png_ptr); 1079 } 1080 1081 for (i = 0; i < 4 && png_ptr->pass == 2; i++) 1082 { 1083 png_push_have_row(png_ptr, NULL); 1084 png_read_push_finish_row(png_ptr); 1085 } 1086 1087 if (png_ptr->pass == 4) /* Pass 3 might be empty */ 1088 { 1089 for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1090 { 1091 png_push_have_row(png_ptr, NULL); 1092 png_read_push_finish_row(png_ptr); 1093 } 1094 } 1095 1096 break; 1097 } 1098 1099 case 3: 1100 { 1101 int i; 1102 1103 for (i = 0; i < 4 && png_ptr->pass == 3; i++) 1104 { 1105 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1106 png_read_push_finish_row(png_ptr); 1107 } 1108 1109 if (png_ptr->pass == 4) /* Skip top two generated rows */ 1110 { 1111 for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1112 { 1113 png_push_have_row(png_ptr, NULL); 1114 png_read_push_finish_row(png_ptr); 1115 } 1116 } 1117 1118 break; 1119 } 1120 1121 case 4: 1122 { 1123 int i; 1124 1125 for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1126 { 1127 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1128 png_read_push_finish_row(png_ptr); 1129 } 1130 1131 for (i = 0; i < 2 && png_ptr->pass == 4; i++) 1132 { 1133 png_push_have_row(png_ptr, NULL); 1134 png_read_push_finish_row(png_ptr); 1135 } 1136 1137 if (png_ptr->pass == 6) /* Pass 5 might be empty */ 1138 { 1139 png_push_have_row(png_ptr, NULL); 1140 png_read_push_finish_row(png_ptr); 1141 } 1142 1143 break; 1144 } 1145 1146 case 5: 1147 { 1148 int i; 1149 1150 for (i = 0; i < 2 && png_ptr->pass == 5; i++) 1151 { 1152 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1153 png_read_push_finish_row(png_ptr); 1154 } 1155 1156 if (png_ptr->pass == 6) /* Skip top generated row */ 1157 { 1158 png_push_have_row(png_ptr, NULL); 1159 png_read_push_finish_row(png_ptr); 1160 } 1161 1162 break; 1163 } 1164 1165 default: 1166 case 6: 1167 { 1168 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1169 png_read_push_finish_row(png_ptr); 1170 1171 if (png_ptr->pass != 6) 1172 break; 1173 1174 png_push_have_row(png_ptr, NULL); 1175 png_read_push_finish_row(png_ptr); 1176 } 1177 } 1178 } 1179 else 1180 #endif 1181 { 1182 png_push_have_row(png_ptr, png_ptr->row_buf + 1); 1183 png_read_push_finish_row(png_ptr); 1184 } 1185 } 1186 1187 void /* PRIVATE */ 1188 png_read_push_finish_row(png_structp png_ptr) 1189 { 1190 #ifdef PNG_READ_INTERLACING_SUPPORTED 1191 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 1192 1193 /* Start of interlace block */ 1194 static PNG_CONST png_byte FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; 1195 1196 /* Offset to next interlace block */ 1197 static PNG_CONST png_byte FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; 1198 1199 /* Start of interlace block in the y direction */ 1200 static PNG_CONST png_byte FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; 1201 1202 /* Offset to next interlace block in the y direction */ 1203 static PNG_CONST png_byte FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; 1204 1205 /* Height of interlace block. This is not currently used - if you need 1206 * it, uncomment it here and in png.h 1207 static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; 1208 */ 1209 #endif 1210 1211 png_ptr->row_number++; 1212 if (png_ptr->row_number < png_ptr->num_rows) 1213 return; 1214 1215 #ifdef PNG_READ_INTERLACING_SUPPORTED 1216 if (png_ptr->interlaced) 1217 { 1218 png_ptr->row_number = 0; 1219 png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); 1220 1221 do 1222 { 1223 png_ptr->pass++; 1224 if ((png_ptr->pass == 1 && png_ptr->width < 5) || 1225 (png_ptr->pass == 3 && png_ptr->width < 3) || 1226 (png_ptr->pass == 5 && png_ptr->width < 2)) 1227 png_ptr->pass++; 1228 1229 if (png_ptr->pass > 7) 1230 png_ptr->pass--; 1231 1232 if (png_ptr->pass >= 7) 1233 break; 1234 1235 png_ptr->iwidth = (png_ptr->width + 1236 png_pass_inc[png_ptr->pass] - 1 - 1237 png_pass_start[png_ptr->pass]) / 1238 png_pass_inc[png_ptr->pass]; 1239 1240 if (png_ptr->transformations & PNG_INTERLACE) 1241 break; 1242 1243 png_ptr->num_rows = (png_ptr->height + 1244 png_pass_yinc[png_ptr->pass] - 1 - 1245 png_pass_ystart[png_ptr->pass]) / 1246 png_pass_yinc[png_ptr->pass]; 1247 1248 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); 1249 } 1250 #endif /* PNG_READ_INTERLACING_SUPPORTED */ 1251 } 1252 1253 void /* PRIVATE */ 1254 png_push_have_info(png_structp png_ptr, png_infop info_ptr) 1255 { 1256 if (png_ptr->info_fn != NULL) 1257 (*(png_ptr->info_fn))(png_ptr, info_ptr); 1258 } 1259 1260 void /* PRIVATE */ 1261 png_push_have_end(png_structp png_ptr, png_infop info_ptr) 1262 { 1263 if (png_ptr->end_fn != NULL) 1264 (*(png_ptr->end_fn))(png_ptr, info_ptr); 1265 } 1266 1267 void /* PRIVATE */ 1268 png_push_have_row(png_structp png_ptr, png_bytep row) 1269 { 1270 if (png_ptr->row_fn != NULL) 1271 (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, 1272 (int)png_ptr->pass); 1273 } 1274 1275 #ifdef PNG_READ_INTERLACING_SUPPORTED 1276 void PNGAPI 1277 png_progressive_combine_row (png_structp png_ptr, png_bytep old_row, 1278 png_const_bytep new_row) 1279 { 1280 if (png_ptr == NULL) 1281 return; 1282 1283 /* new_row is a flag here - if it is NULL then the app callback was called 1284 * from an empty row (see the calls to png_struct::row_fn below), otherwise 1285 * it must be png_ptr->row_buf+1 1286 */ 1287 if (new_row != NULL) 1288 png_combine_row(png_ptr, old_row, 1/*display*/); 1289 } 1290 #endif /* PNG_READ_INTERLACING_SUPPORTED */ 1291 1292 void PNGAPI 1293 png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, 1294 png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, 1295 png_progressive_end_ptr end_fn) 1296 { 1297 if (png_ptr == NULL) 1298 return; 1299 1300 png_ptr->info_fn = info_fn; 1301 png_ptr->row_fn = row_fn; 1302 png_ptr->end_fn = end_fn; 1303 1304 png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); 1305 } 1306 1307 png_voidp PNGAPI 1308 png_get_progressive_ptr(png_const_structp png_ptr) 1309 { 1310 if (png_ptr == NULL) 1311 return (NULL); 1312 1313 return png_ptr->io_ptr; 1314 } 1315 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1316