Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(335)

Side by Side Diff: third_party/libpng/pngpread.c

Issue 2835021: Update libpng to version 1.2.44 (Closed)
Patch Set: Update to 1.2.44 Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libpng/png.h ('k') | third_party/libpng/pngread.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* pngpread.c - read a png file in push mode 2 /* pngpread.c - read a png file in push mode
3 * 3 *
4 * Last changed in libpng 1.2.43 [February 25, 2010] 4 * Last changed in libpng 1.2.44 [June 26, 2010]
5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson 5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8 * 8 *
9 * This code is released under the libpng license. 9 * This code is released under the libpng license.
10 * For conditions of distribution and use, see the disclaimer 10 * For conditions of distribution and use, see the disclaimer
11 * and license in png.h 11 * and license in png.h
12 */ 12 */
13 13
14 #define PNG_INTERNAL 14 #define PNG_INTERNAL
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 776
777 /* Check for overflow */ 777 /* Check for overflow */
778 if ((png_uint_32)save_size != png_ptr->idat_size) 778 if ((png_uint_32)save_size != png_ptr->idat_size)
779 png_error(png_ptr, "save_size overflowed in pngpread"); 779 png_error(png_ptr, "save_size overflowed in pngpread");
780 } 780 }
781 else 781 else
782 save_size = png_ptr->save_buffer_size; 782 save_size = png_ptr->save_buffer_size;
783 783
784 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); 784 png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
785 785
786 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 786 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
787 png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
788 787
789 png_ptr->idat_size -= save_size; 788 png_ptr->idat_size -= save_size;
790 png_ptr->buffer_size -= save_size; 789 png_ptr->buffer_size -= save_size;
791 png_ptr->save_buffer_size -= save_size; 790 png_ptr->save_buffer_size -= save_size;
792 png_ptr->save_buffer_ptr += save_size; 791 png_ptr->save_buffer_ptr += save_size;
793 } 792 }
794 if (png_ptr->idat_size && png_ptr->current_buffer_size) 793 if (png_ptr->idat_size && png_ptr->current_buffer_size)
795 { 794 {
796 png_size_t save_size; 795 png_size_t save_size;
797 796
798 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) 797 if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
799 { 798 {
800 save_size = (png_size_t)png_ptr->idat_size; 799 save_size = (png_size_t)png_ptr->idat_size;
801 800
802 /* Check for overflow */ 801 /* Check for overflow */
803 if ((png_uint_32)save_size != png_ptr->idat_size) 802 if ((png_uint_32)save_size != png_ptr->idat_size)
804 png_error(png_ptr, "save_size overflowed in pngpread"); 803 png_error(png_ptr, "save_size overflowed in pngpread");
805 } 804 }
806 else 805 else
807 save_size = png_ptr->current_buffer_size; 806 save_size = png_ptr->current_buffer_size;
808 807
809 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); 808 png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
810 if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) 809 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
811 png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
812 810
813 png_ptr->idat_size -= save_size; 811 png_ptr->idat_size -= save_size;
814 png_ptr->buffer_size -= save_size; 812 png_ptr->buffer_size -= save_size;
815 png_ptr->current_buffer_size -= save_size; 813 png_ptr->current_buffer_size -= save_size;
816 png_ptr->current_buffer_ptr += save_size; 814 png_ptr->current_buffer_ptr += save_size;
817 } 815 }
818 if (!png_ptr->idat_size) 816 if (!png_ptr->idat_size)
819 { 817 {
820 if (png_ptr->buffer_size < 4) 818 if (png_ptr->buffer_size < 4)
821 { 819 {
822 png_push_save_buffer(png_ptr); 820 png_push_save_buffer(png_ptr);
823 return; 821 return;
824 } 822 }
825 823
826 png_crc_finish(png_ptr, 0); 824 png_crc_finish(png_ptr, 0);
827 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; 825 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
828 png_ptr->mode |= PNG_AFTER_IDAT; 826 png_ptr->mode |= PNG_AFTER_IDAT;
829 } 827 }
830 } 828 }
831 829
832 void /* PRIVATE */ 830 void /* PRIVATE */
833 png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, 831 png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
834 png_size_t buffer_length) 832 png_size_t buffer_length)
835 { 833 {
836 int ret; 834 /* The caller checks for a non-zero buffer length. */
835 if (!(buffer_length > 0) || buffer == NULL)
836 png_error(png_ptr, "No IDAT data (internal error)");
837 837
838 if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) 838 /* This routine must process all the data it has been given
839 png_error(png_ptr, "Extra compression data"); 839 * before returning, calling the row callback as required to
840 840 * handle the uncompressed results.
841 */
841 png_ptr->zstream.next_in = buffer; 842 png_ptr->zstream.next_in = buffer;
842 png_ptr->zstream.avail_in = (uInt)buffer_length; 843 png_ptr->zstream.avail_in = (uInt)buffer_length;
843 for (;;) 844
845 /* Keep going until the decompressed data is all processed
846 * or the stream marked as finished.
847 */
848 while (png_ptr->zstream.avail_in > 0 &&
849 » !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
844 { 850 {
845 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); 851 int ret;
846 if (ret != Z_OK) 852 /* We have data for zlib, but we must check that zlib
853 * has somewhere to put the results. It doesn't matter
854 * if we don't expect any results -- it may be the input
855 * data is just the LZ end code.
856 */
857 if (!(png_ptr->zstream.avail_out > 0))
847 { 858 {
848 if (ret == Z_STREAM_END)
849 {
850 if (png_ptr->zstream.avail_in)
851 png_error(png_ptr, "Extra compressed data");
852
853 if (!(png_ptr->zstream.avail_out))
854 {
855 png_push_process_row(png_ptr);
856 }
857
858 png_ptr->mode |= PNG_AFTER_IDAT;
859 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
860 break;
861 }
862 else if (ret == Z_BUF_ERROR)
863 break;
864
865 else
866 png_error(png_ptr, "Decompression Error");
867 }
868 if (!(png_ptr->zstream.avail_out))
869 {
870 if ((
871 #ifdef PNG_READ_INTERLACING_SUPPORTED
872 png_ptr->interlaced && png_ptr->pass > 6) ||
873 (!png_ptr->interlaced &&
874 #endif
875 png_ptr->row_number == png_ptr->num_rows))
876 {
877 if (png_ptr->zstream.avail_in)
878 png_warning(png_ptr, "Too much data in IDAT chunks");
879 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
880 break;
881 }
882 png_push_process_row(png_ptr);
883 png_ptr->zstream.avail_out = 859 png_ptr->zstream.avail_out =
884 (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, 860 (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
885 png_ptr->iwidth) + 1; 861 png_ptr->iwidth) + 1;
886 png_ptr->zstream.next_out = png_ptr->row_buf; 862 png_ptr->zstream.next_out = png_ptr->row_buf;
887 } 863 }
888 864
865 /* Using Z_SYNC_FLUSH here means that an unterminated
866 * LZ stream can still be handled (a stream with a missing
867 * end code), otherwise (Z_NO_FLUSH) a future zlib
868 * implementation might defer output and, therefore,
869 * change the current behavior. (See comments in inflate.c
870 * for why this doesn't happen at present with zlib 1.2.5.)
871 */
872 ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH);
873
874 /* Check for any failure before proceeding. */
875 if (ret != Z_OK && ret != Z_STREAM_END)
876 {
877 /* Terminate the decompression. */
878 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
879 /* This may be a truncated stream (missing or
880 * damaged end code). Treat that as a warning.
881 */
882 if (png_ptr->row_number >= png_ptr->num_rows ||
883 png_ptr->pass > 6)
884 png_warning(png_ptr, "Truncated compressed data in IDAT");
885 else
886 png_error(png_ptr, "Decompression error in IDAT");
887
888 /* Skip the check on unprocessed input */
889 return;
890 }
891
892 /* Did inflate output any data? */
893 if (png_ptr->zstream.next_out != png_ptr->row_buf)
894 {
895 /* Is this unexpected data after the last row?
896 * If it is, artificially terminate the LZ output
897 * here.
898 */
899 if (png_ptr->row_number >= png_ptr->num_rows ||
900 png_ptr->pass > 6)
901 {
902 /* Extra data. */
903 png_warning(png_ptr, "Extra compressed data in IDAT");
904 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
905 /* Do no more processing; skip the unprocessed
906 * input check below.
907 */
908 return;
909 }
910
911 /* Do we have a complete row? */
912 if (png_ptr->zstream.avail_out == 0)
913 png_push_process_row(png_ptr);
914 }
915
889 else 916 else
890 break; 917 break;
918 /* And check for the end of the stream. */
919 if (ret == Z_STREAM_END)
920 png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
891 } 921 }
922
923 /* All the data should have been processed, if anything
924 * is left at this point we have bytes of IDAT data
925 * after the zlib end code.
926 */
927 if (png_ptr->zstream.avail_in > 0)
928 png_warning(png_ptr, "Extra compression data");
892 } 929 }
893 930
894 void /* PRIVATE */ 931 void /* PRIVATE */
895 png_push_process_row(png_structp png_ptr) 932 png_push_process_row(png_structp png_ptr)
896 { 933 {
897 png_ptr->row_info.color_type = png_ptr->color_type; 934 png_ptr->row_info.color_type = png_ptr->color_type;
898 png_ptr->row_info.width = png_ptr->iwidth; 935 png_ptr->row_info.width = png_ptr->iwidth;
899 png_ptr->row_info.channels = png_ptr->channels; 936 png_ptr->row_info.channels = png_ptr->channels;
900 png_ptr->row_info.bit_depth = png_ptr->bit_depth; 937 png_ptr->row_info.bit_depth = png_ptr->bit_depth;
901 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; 938 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
(...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 1764
1728 png_voidp PNGAPI 1765 png_voidp PNGAPI
1729 png_get_progressive_ptr(png_structp png_ptr) 1766 png_get_progressive_ptr(png_structp png_ptr)
1730 { 1767 {
1731 if (png_ptr == NULL) 1768 if (png_ptr == NULL)
1732 return (NULL); 1769 return (NULL);
1733 1770
1734 return png_ptr->io_ptr; 1771 return png_ptr->io_ptr;
1735 } 1772 }
1736 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ 1773 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
OLDNEW
« no previous file with comments | « third_party/libpng/png.h ('k') | third_party/libpng/pngread.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698