#define EFREE_IF(ptr) if (ptr) efree(ptr)
- #define MAX_IFD_NESTING_LEVEL 150
+ #define MAX_IFD_NESTING_LEVEL 200
-/* {{{ arginfo */
-ZEND_BEGIN_ARG_INFO(arginfo_exif_tagname, 0)
- ZEND_ARG_INFO(0, index)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_exif_read_data, 0, 0, 1)
- ZEND_ARG_INFO(0, filename)
- ZEND_ARG_INFO(0, sections_needed)
- ZEND_ARG_INFO(0, sub_arrays)
- ZEND_ARG_INFO(0, read_thumbnail)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_exif_thumbnail, 0, 0, 1)
- ZEND_ARG_INFO(0, filename)
- ZEND_ARG_INFO(1, width)
- ZEND_ARG_INFO(1, height)
- ZEND_ARG_INFO(1, imagetype)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_exif_imagetype, 0)
- ZEND_ARG_INFO(0, imagefile)
-ZEND_END_ARG_INFO()
-
-/* }}} */
-
-/* {{{ exif_functions[]
- */
-static const zend_function_entry exif_functions[] = {
- PHP_FE(exif_read_data, arginfo_exif_read_data)
- PHP_DEP_FALIAS(read_exif_data, exif_read_data, arginfo_exif_read_data)
- PHP_FE(exif_tagname, arginfo_exif_tagname)
- PHP_FE(exif_thumbnail, arginfo_exif_thumbnail)
- PHP_FE(exif_imagetype, arginfo_exif_imagetype)
- PHP_FE_END
-};
-/* }}} */
-
-/* {{{ PHP_MINFO_FUNCTION
- */
+/* {{{ PHP_MINFO_FUNCTION */
PHP_MINFO_FUNCTION(exif)
{
php_info_print_table_start();
}
if ((dir_start - value_ptr) > value_len - (2+NumDirEntries*12)) {
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "Illegal IFD size: 0x%04X > 0x%04X", (dir_start - value_ptr) + (2+NumDirEntries*12), value_len);
- return FALSE;
+ return false;
}
- offset_base = value_ptr;
- data_len = value_len;
- break;
-#ifdef KALLE_0
- case MN_OFFSET_GUESS:
- if (maker_note->offset + 10 + 4 >= value_len) {
- /* Can not read dir_start+10 since it's beyond value end */
- exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "IFD data too short: 0x%04X", value_len);
- return FALSE;
- }
- offset_diff = 2 + NumDirEntries*12 + 4 - php_ifd_get32u(dir_start+10, ImageInfo->motorola_intel);
-#ifdef EXIF_DEBUG
- exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "Using automatic offset correction: 0x%04X", ((int)dir_start-(int)offset_base+maker_note->offset+displacement) + offset_diff);
-#endif
- if (offset_diff < 0 || offset_diff >= value_len ) {
- exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "IFD data bad offset: 0x%04X length 0x%04X", offset_diff, value_len);
- return FALSE;
- }
- offset_base = value_ptr + offset_diff;
- data_len = value_len - offset_diff;
+ switch (maker_note->offset_mode) {
+ case MN_OFFSET_MAKER:
-#endif
++ exif_offset_info_init(&new_info, value_ptr, value_ptr, value_len);
++ info = &new_info;
+ break;
- data_len = value_len;
+ default:
+ case MN_OFFSET_NORMAL:
+ break;
+ }
+
for (de=0;de<NumDirEntries;de++) {
size_t offset = 2 + 12 * de;
if (!exif_process_IFD_TAG(ImageInfo, dir_start + offset,