Skip to content

Commit eebcbd5

Browse files
committed
Fix bug #72603: Out of bound read in exif_process_IFD_in_MAKERNOTE
1 parent 3798eb6 commit eebcbd5

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

ext/exif/exif.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,12 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
27422742
break;
27432743
}
27442744

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+
27452751
dir_start = value_ptr + maker_note->offset;
27462752

27472753
#ifdef EXIF_DEBUG
@@ -2770,10 +2776,19 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
27702776
offset_base = value_ptr;
27712777
break;
27722778
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+
}
27732784
offset_diff = 2 + NumDirEntries*12 + 4 - php_ifd_get32u(dir_start+10, ImageInfo->motorola_intel);
27742785
#ifdef EXIF_DEBUG
27752786
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);
27762787
#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+
}
27772792
offset_base = value_ptr + offset_diff;
27782793
break;
27792794
default:
@@ -2782,7 +2797,7 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
27822797
}
27832798

27842799
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);
27862801
return FALSE;
27872802
}
27882803

@@ -3068,7 +3083,10 @@ static int exif_process_IFD_TAG(image_info_type *ImageInfo, char *dir_entry, cha
30683083
break;
30693084

30703085
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+
}
30723090
break;
30733091

30743092
case TAG_EXIF_IFD_POINTER:

ext/exif/tests/bug72603.jpeg

3.62 KB
Loading

ext/exif/tests/bug72603.phpt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--TEST--
2+
Bug #72603 (Out of bound read in exif_process_IFD_in_MAKERNOTE)
3+
--SKIPIF--
4+
<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?>
5+
--FILE--
6+
<?php
7+
var_dump(count(exif_read_data(dirname(__FILE__) . "/bug72603.jpeg")));
8+
?>
9+
--EXPECTF--
10+
Warning: exif_read_data(bug72603.jpeg): IFD data bad offset: 0x058C length 0x001C in %s/bug72603.php on line %d
11+
int(13)

0 commit comments

Comments
 (0)