@@ -64,7 +64,7 @@ typedef unsigned char uchar;
6464
6565#define EFREE_IF (ptr ) if (ptr) efree(ptr)
6666
67- #define MAX_IFD_NESTING_LEVEL 150
67+ #define MAX_IFD_NESTING_LEVEL 200
6868
6969/* {{{ arginfo */
7070ZEND_BEGIN_ARG_INFO (arginfo_exif_tagname , 0 )
@@ -3210,6 +3210,23 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
32103210
32113211 NumDirEntries = php_ifd_get16u (dir_start , ImageInfo -> motorola_intel );
32123212
3213+ /* It can be that motorola_intel is wrongly mapped, let's try inverting it */
3214+ if ((2 + NumDirEntries * 12 ) > value_len ) {
3215+ exif_error_docref (NULL EXIFERR_CC , ImageInfo , E_NOTICE , "Potentially invalid endianess, trying again with different endianness before imminent failure." );
3216+
3217+ ImageInfo -> motorola_intel = ImageInfo -> motorola_intel == 0 ? 1 : 0 ;
3218+ NumDirEntries = php_ifd_get16u (dir_start , ImageInfo -> motorola_intel );
3219+ }
3220+
3221+ if ((2 + NumDirEntries * 12 ) > value_len ) {
3222+ exif_error_docref ("exif_read_data#error_ifd" EXIFERR_CC , ImageInfo , E_WARNING , "Illegal IFD size: 2 + 0x%04X*12 = 0x%04X > 0x%04X" , NumDirEntries , 2 + NumDirEntries * 12 , value_len );
3223+ return FALSE;
3224+ }
3225+ if ((dir_start - value_ptr ) > value_len - (2 + NumDirEntries * 12 )) {
3226+ 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 );
3227+ return FALSE;
3228+ }
3229+
32133230 switch (maker_note -> offset_mode ) {
32143231 case MN_OFFSET_MAKER :
32153232 offset_base = value_ptr ;
@@ -3240,15 +3257,6 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
32403257 break ;
32413258 }
32423259
3243- if ((2 + NumDirEntries * 12 ) > value_len ) {
3244- exif_error_docref ("exif_read_data#error_ifd" EXIFERR_CC , ImageInfo , E_WARNING , "Illegal IFD size: 2 + 0x%04X*12 = 0x%04X > 0x%04X" , NumDirEntries , 2 + NumDirEntries * 12 , value_len );
3245- return FALSE;
3246- }
3247- if ((dir_start - value_ptr ) > value_len - (2 + NumDirEntries * 12 )) {
3248- 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 );
3249- return FALSE;
3250- }
3251-
32523260 for (de = 0 ;de < NumDirEntries ;de ++ ) {
32533261 size_t offset = 2 + 12 * de ;
32543262 if (!exif_process_IFD_TAG (ImageInfo , dir_start + offset ,
0 commit comments