summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKalle Sommer Nielsen <kalle@php.net>2016-08-03 17:05:31 +0200
committerAnatol Belski <ab@php.net>2016-08-03 17:46:59 +0200
commit91641c23fc77b156e188f9591d7310ecf5c9c2a0 (patch)
tree756fc65e65d95ccc4db98434b9c9285d5214afe2
parente8f76d10ab395b6a9a5c228b1a857d9b66b2092c (diff)
downloadphp-git-91641c23fc77b156e188f9591d7310ecf5c9c2a0.tar.gz
Changed the way MAKERNOTE is handled in case we do not have a matching signature (Remi).
Before this patch, exif_process_IFD_in_MAKERNOTE() would return false, then causing the rest of the EXIF parsing to be interrupted. This is a regression from earlier which was most likely a part of a security fix for MAKERNOTE. The new behavior is to instead of stopping to parse, to continue so we can still fetch data like thumbnail and GPS, thrus allowing yet unsupported formats to parse. If EXIF's debugging mode is enabled, a notice will display in case we do not match against a valid MAKERNOTE signature. This should temporarily fix bug #72682 (exif_read_data() fails to read all data for some images) until I get around to debug it further. (cherry picked from commit aabcb5481d9e717df77192dab2894468b9fc63b4)
-rw-r--r--ext/exif/exif.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/ext/exif/exif.c b/ext/exif/exif.c
index cf221419d5..a7452184f9 100644
--- a/ext/exif/exif.c
+++ b/ext/exif/exif.c
@@ -1702,6 +1702,10 @@ static void exif_iif_add_value(image_info_type *image_info, int section_index, c
if (!length)
break;
case TAG_FMT_UNDEFINED:
+ if (tag == TAG_MAKER_NOTE) {
+ length = MIN(length, strlen(value));
+ }
+
if (value) {
/* do not recompute length here */
info_value->s = estrndup(value, length);
@@ -2712,8 +2716,14 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
char *dir_start;
for (i=0; i<=sizeof(maker_note_array)/sizeof(maker_note_type); i++) {
- if (i==sizeof(maker_note_array)/sizeof(maker_note_type))
- return FALSE;
+ if (i==sizeof(maker_note_array)/sizeof(maker_note_type)) {
+#ifdef EXIF_DEBUG
+ exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "No maker note data found. Detected maker: %s (length = %d)", ImageInfo->make, strlen(ImageInfo->make));
+#endif
+ /* unknown manufacturer, not an error, use it as a string */
+ return TRUE;
+ }
+
maker_note = maker_note_array+i;
/*exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "check (%s,%s)", maker_note->make?maker_note->make:"", maker_note->model?maker_note->model:"");*/