+#ifdef PNG_READ_eXIf_SUPPORTED\r
+void /* PRIVATE */\r
+png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)\r
+{\r
+ unsigned int i;\r
+\r
+ png_debug(1, "in png_handle_eXIf");\r
+\r
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)\r
+ png_chunk_error(png_ptr, "missing IHDR");\r
+\r
+ if (length < 2)\r
+ {\r
+ png_crc_finish(png_ptr, length);\r
+ png_chunk_benign_error(png_ptr, "too short");\r
+ return;\r
+ }\r
+\r
+ else if (info_ptr == NULL || (info_ptr->valid & PNG_INFO_eXIf) != 0)\r
+ {\r
+ png_crc_finish(png_ptr, length);\r
+ png_chunk_benign_error(png_ptr, "duplicate");\r
+ return;\r
+ }\r
+\r
+ info_ptr->free_me |= PNG_FREE_EXIF;\r
+\r
+ info_ptr->eXIf_buf = png_voidcast(png_bytep,\r
+ png_malloc_warn(png_ptr, length));\r
+\r
+ if (info_ptr->eXIf_buf == NULL)\r
+ {\r
+ png_crc_finish(png_ptr, length);\r
+ png_chunk_benign_error(png_ptr, "out of memory");\r
+ return;\r
+ }\r
+\r
+ for (i = 0; i < length; i++)\r
+ {\r
+ png_byte buf[1];\r
+ png_crc_read(png_ptr, buf, 1);\r
+ info_ptr->eXIf_buf[i] = buf[0];\r
+ if (i == 1 && buf[0] != 'M' && buf[0] != 'I'\r
+ && info_ptr->eXIf_buf[0] != buf[0])\r
+ {\r
+ png_crc_finish(png_ptr, length);\r
+ png_chunk_benign_error(png_ptr, "incorrect byte-order specifier");\r
+ png_free(png_ptr, info_ptr->eXIf_buf);\r
+ info_ptr->eXIf_buf = NULL;\r
+ return;\r
+ }\r
+ }\r
+\r
+ if (png_crc_finish(png_ptr, 0) != 0)\r
+ return;\r
+\r
+ png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf);\r
+\r
+ png_free(png_ptr, info_ptr->eXIf_buf);\r
+ info_ptr->eXIf_buf = NULL;\r
+}\r
+#endif\r
+\r