@@ -2742,6 +2742,12 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
2742
2742
break ;
2743
2743
}
2744
2744
2745
+ if (maker_note -> offset >= value_len ) {
2746
+ /* Do not go past the value end */
2747
+ exif_error_docref ("exif_read_data#error_ifd" EXIFERR_CC , ImageInfo , E_WARNING , "IFD data too short: 0x%04X offset 0x%04X" , value_len , maker_note -> offset );
2748
+ return FALSE;
2749
+ }
2750
+
2745
2751
dir_start = value_ptr + maker_note -> offset ;
2746
2752
2747
2753
#ifdef EXIF_DEBUG
@@ -2770,10 +2776,19 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
2770
2776
offset_base = value_ptr ;
2771
2777
break ;
2772
2778
case MN_OFFSET_GUESS :
2779
+ if (maker_note -> offset + 10 + 4 >= value_len ) {
2780
+ /* Can not read dir_start+10 since it's beyond value end */
2781
+ exif_error_docref ("exif_read_data#error_ifd" EXIFERR_CC , ImageInfo , E_WARNING , "IFD data too short: 0x%04X" , value_len );
2782
+ return FALSE;
2783
+ }
2773
2784
offset_diff = 2 + NumDirEntries * 12 + 4 - php_ifd_get32u (dir_start + 10 , ImageInfo -> motorola_intel );
2774
2785
#ifdef EXIF_DEBUG
2775
2786
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 );
2776
2787
#endif
2788
+ if (offset_diff < 0 || offset_diff >= value_len ) {
2789
+ 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 );
2790
+ return FALSE;
2791
+ }
2777
2792
offset_base = value_ptr + offset_diff ;
2778
2793
break ;
2779
2794
default :
@@ -2782,7 +2797,7 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
2782
2797
}
2783
2798
2784
2799
if ((2 + NumDirEntries * 12 ) > value_len ) {
2785
- exif_error_docref ("exif_read_data#error_ifd" EXIFERR_CC , ImageInfo , E_WARNING , "Illegal IFD size: 2 + x %04X*12 = x %04X > x %04X" , NumDirEntries , 2 + NumDirEntries * 12 , value_len );
2800
+ 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 );
2786
2801
return FALSE;
2787
2802
}
2788
2803
@@ -3068,7 +3083,10 @@ static int exif_process_IFD_TAG(image_info_type *ImageInfo, char *dir_entry, cha
3068
3083
break ;
3069
3084
3070
3085
case TAG_MAKER_NOTE :
3071
- exif_process_IFD_in_MAKERNOTE (ImageInfo , value_ptr , byte_count , offset_base , IFDlength , displacement TSRMLS_CC );
3086
+ if (!exif_process_IFD_in_MAKERNOTE (ImageInfo , value_ptr , byte_count , offset_base , IFDlength , displacement TSRMLS_CC )) {
3087
+ EFREE_IF (outside );
3088
+ return FALSE;
3089
+ }
3072
3090
break ;
3073
3091
3074
3092
case TAG_EXIF_IFD_POINTER :
0 commit comments