com php-src: Fixed bug #72735 (Samsung picture thumb not read (zero size)): ext/exif/exif.c ext/exif/tests/bug72735/bug72735.phpt
ext/exif/tests/bug72735/nokia.jpg ext/exif/tests/bug72735/samsung.jpg

From: Date: Wed, 03 Aug 2016 08:02:22 +0000
Subject: com php-src: Fixed bug #72735 (Samsung picture thumb not read (zero size)): ext/exif/exif.c ext/exif/tests/bug72735/bug72735.phpt
ext/exif/tests/bug72735/nokia.jpg ext/exif/tests/bug72735/samsung.jpg
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-93551@lists.php.net to get a copy of this message
Commit: 9c8c37854efe843e45228597837fc4b6aac59113 Author: Kalle Sommer Nielsen <kalle@php.net> Wed, 3 Aug 2016 10:02:22 +0200 Parents: 1e02e528591544c3e85193531038fa7dcaf3c9ac Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=9c8c37854efe843e45228597837fc4b6aac59113 Log: Fixed bug #72735 (Samsung picture thumb not read (zero size)) It seems like there is no maker data for "Samsung", this causes the IDF tag parsing to fail, and it bails early on, despite there still is valid remaining data in image, such as the thumbnail data as reported in the bug. I used the Exiv2 website as a reference guide for tags that's specific to Samsung's EXIF data, which should also mean that we will be able to name some of those tags more specifically now. I have chosen again not to commit this to other branches, simply because I'm not 100% sure on the byte order and offsets for Samsung, I did some research and it seems like there are many variants, but this (very copy/pasted), entry works for this particular image and does not break any other tests. This does add a new feature I suppose, while also fixing a bug, but I will leave it to the other branch RMs to decide on how far down they will want to merge this. Bugs: https://bugs.php.net/72735 Changed paths: M ext/exif/exif.c A ext/exif/tests/bug72735/bug72735.phpt A ext/exif/tests/bug72735/nokia.jpg A ext/exif/tests/bug72735/samsung.jpg Diff: diff --git a/ext/exif/exif.c b/ext/exif/exif.c index 9f951d7..e08509a 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -955,6 +955,40 @@ static tag_info_array tag_table_VND_OLYMPUS = { TAG_TABLE_END }; +static tag_info_array tag_table_VND_SAMSUNG = { + { 0x0001, "Version"}, + { 0x0021, "PictureWizard"}, + { 0x0030, "LocalLocationName"}, + { 0x0031, "LocationName"}, + { 0x0035, "Preview"}, + { 0x0043, "CameraTemperature"}, + { 0xa001, "FirmwareName"}, + { 0xa003, "LensType"}, + { 0xa004, "LensFirmware"}, + { 0xa010, "SensorAreas"}, + { 0xa011, "ColorSpace"}, + { 0xa012, "SmartRange"}, + { 0xa013, "ExposureBiasValue"}, + { 0xa014, "ISO"}, + { 0xa018, "ExposureTime"}, + { 0xa019, "FNumber"}, + { 0xa01a, "FocalLengthIn35mmFormat"}, + { 0xa020, "EncryptionKey"}, + { 0xa021, "WB_RGGBLevelsUncorrected"}, + { 0xa022, "WB_RGGBLevelsAuto"}, + { 0xa023, "WB_RGGBLevelsIlluminator1"}, + { 0xa024, "WB_RGGBLevelsIlluminator2"}, + { 0xa028, "WB_RGGBLevelsBlack"}, + { 0xa030, "ColorMatrix"}, + { 0xa031, "ColorMatrixSRGB"}, + { 0xa032, "ColorMatrixAdobeRGB"}, + { 0xa040, "ToneCurve1"}, + { 0xa041, "ToneCurve2"}, + { 0xa042, "ToneCurve3"}, + { 0xa043, "ToneCurve4"}, + TAG_TABLE_END +}; + typedef enum mn_byte_order_t { MN_ORDER_INTEL = 0, MN_ORDER_MOTOROLA = 1, @@ -986,6 +1020,7 @@ static const maker_note_type maker_note_array[] = { { tag_table_VND_NIKON, "NIKON", NULL, "Nikon\x00\x01\x00", 8, 8, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, { tag_table_VND_NIKON_990, "NIKON", NULL, NULL, 0, 0, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, { tag_table_VND_OLYMPUS, "OLYMPUS OPTICAL CO.,LTD", NULL, "OLYMP\x00\x01\x00", 8, 8, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, + { tag_table_VND_SAMSUNG, "SAMSUNG", NULL, NULL, 0, 0, MN_ORDER_NORMAL, MN_OFFSET_NORMAL} }; /* }}} */ @@ -2711,7 +2746,7 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu int NumDirEntries, old_motorola_intel, offset_diff; const maker_note_type *maker_note; 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; @@ -2726,7 +2761,7 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu continue; break; } - + if (maker_note->offset >= value_len) { /* Do not go past the value end */ 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); diff --git a/ext/exif/tests/bug72735/bug72735.phpt b/ext/exif/tests/bug72735/bug72735.phpt new file mode 100644 index 0000000..24b2a04 --- /dev/null +++ b/ext/exif/tests/bug72735/bug72735.phpt @@ -0,0 +1,23 @@ +--TEST-- +Bug #72735 (Samsung picture thumb not read (zero size)) +--SKIPIF-- +<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?> +--FILE-- +<?php +foreach (['nokia.jpg', 'samsung.jpg'] as $picture) { + echo $picture . ': '; + + $len = strlen(exif_thumbnail(__DIR__ . DIRECTORY_SEPARATOR . $picture)); + + if (!$len) { + echo 'Error, no length returned', PHP_EOL; + + continue; + } + + echo 'int(' . $len . ')', PHP_EOL; +} +?> +--EXPECTF-- +nokia.jpg: int(5899) +samsung.jpg: int(5778) diff --git a/ext/exif/tests/bug72735/nokia.jpg b/ext/exif/tests/bug72735/nokia.jpg new file mode 100644 index 0000000..48367bf Binary files /dev/null and b/ext/exif/tests/bug72735/nokia.jpg differ diff --git a/ext/exif/tests/bug72735/samsung.jpg b/ext/exif/tests/bug72735/samsung.jpg new file mode 100644 index 0000000..7009606 Binary files /dev/null and b/ext/exif/tests/bug72735/samsung.jpg differ

« previous php.cvs (#93551) next »