@@ -64,7 +64,7 @@ typedef unsigned char uchar;
64
64
65
65
#define EFREE_IF (ptr ) if (ptr) efree(ptr)
66
66
67
- #define MAX_IFD_NESTING_LEVEL 150
67
+ #define MAX_IFD_NESTING_LEVEL 200
68
68
69
69
/* {{{ arginfo */
70
70
ZEND_BEGIN_ARG_INFO (arginfo_exif_tagname , 0 )
@@ -3210,6 +3210,23 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
3210
3210
3211
3211
NumDirEntries = php_ifd_get16u (dir_start , ImageInfo -> motorola_intel );
3212
3212
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
+
3213
3230
switch (maker_note -> offset_mode ) {
3214
3231
case MN_OFFSET_MAKER :
3215
3232
offset_base = value_ptr ;
@@ -3240,15 +3257,6 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
3240
3257
break ;
3241
3258
}
3242
3259
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
-
3252
3260
for (de = 0 ;de < NumDirEntries ;de ++ ) {
3253
3261
size_t offset = 2 + 12 * de ;
3254
3262
if (!exif_process_IFD_TAG (ImageInfo , dir_start + offset ,
0 commit comments