laag-libpng 1.6.34.0

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