From fbb169019842996db693e021c46dac9b68698f15 Mon Sep 17 00:00:00 2001 From: Kalle Sommer Nielsen Date: Wed, 3 Aug 2016 11:59:30 +0200 Subject: [PATCH] Fixed Redhat bug #1362571 (PHP not returning full results for exif_read_data function) There are two factors for this bug fix: - First of all, the maximum nesting level has been increased to 150 (previously 100), I'm not sure how much an impact this will have, but increasing this value also seems to resolve PHP bug #66443 (Corrupt EXIF header: maximum directory nesting level reached for some cameras.) - Second, this adds support for most common Panasonic EXIF tags, again this list is based off the Exiv2 website Note about Panasonic's format: From what I could find, then the offset was always 12 bytes for such, the signature always had the 'P' capitalized, and the rest lower cased, followed by 3 NULL bytes @Remi, can you review this? I'm gonna look into Sony (which is huge btw!) and your patch next --- ext/exif/exif.c | 173 +++++++++++++++++++++----- ext/exif/tests/redhat-bug1362571.jpg | Bin 0 -> 16629 bytes ext/exif/tests/redhat-bug1362571.phpt | 10 ++ 3 files changed, 150 insertions(+), 33 deletions(-) create mode 100644 ext/exif/tests/redhat-bug1362571.jpg create mode 100644 ext/exif/tests/redhat-bug1362571.phpt diff --git a/ext/exif/exif.c b/ext/exif/exif.c index e08509a0815..82473db8118 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -89,7 +89,7 @@ typedef unsigned char uchar; #define EFREE_IF(ptr) if (ptr) efree(ptr) -#define MAX_IFD_NESTING_LEVEL 100 +#define MAX_IFD_NESTING_LEVEL 150 /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO(arginfo_exif_tagname, 0) @@ -956,37 +956,143 @@ static tag_info_array tag_table_VND_OLYMPUS = { }; 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 + { 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 +}; + +static tag_info_array tag_table_VND_PANASONIC = { + { 0x0001, "Quality"}, + { 0x0002, "FirmwareVersion"}, + { 0x0003, "WhiteBalance"}, + { 0x0004, "0x0004"}, + { 0x0007, "FocusMode"}, + { 0x000f, "AFMode"}, + { 0x001a, "ImageStabilization"}, + { 0x001c, "Macro"}, + { 0x001f, "ShootingMode"}, + { 0x0020, "Audio"}, + { 0x0021, "DataDump"}, + { 0x0022, "0x0022"}, + { 0x0023, "WhiteBalanceBias"}, + { 0x0024, "FlashBias"}, + { 0x0025, "InternalSerialNumber"}, + { 0x0026, "ExifVersion"}, + { 0x0027, "0x0027"}, + { 0x0028, "ColorEffect"}, + { 0x0029, "TimeSincePowerOn"}, + { 0x002a, "BurstMode"}, + { 0x002b, "SequenceNumber"}, + { 0x002c, "Contrast"}, + { 0x002d, "NoiseReduction"}, + { 0x002e, "SelfTimer"}, + { 0x002f, "0x002f"}, + { 0x0030, "Rotation"}, + { 0x0031, "AFAssistLamp"}, + { 0x0032, "ColorMode"}, + { 0x0033, "BabyAge1"}, + { 0x0034, "OpticalZoomMode"}, + { 0x0035, "ConversionLens"}, + { 0x0036, "TravelDay"}, + { 0x0039, "Contrast"}, + { 0x003a, "WorldTimeLocation"}, + { 0x003b, "TextStamp1"}, + { 0x003c, "ProgramISO"}, + { 0x003d, "AdvancedSceneType"}, + { 0x003e, "TextStamp2"}, + { 0x003f, "FacesDetected"}, + { 0x0040, "Saturation"}, + { 0x0041, "Sharpness"}, + { 0x0042, "FilmMode"}, + { 0x0044, "ColorTempKelvin"}, + { 0x0045, "BracketSettings"}, + { 0x0046, "WBAdjustAB"}, + { 0x0047, "WBAdjustGM"}, + { 0x0048, "FlashCurtain"}, + { 0x0049, "LongShutterNoiseReduction"}, + { 0x004b, "ImageWidth"}, + { 0x004c, "ImageHeight"}, + { 0x004d, "AFPointPosition"}, + { 0x004e, "FaceDetInfo"}, + { 0x0051, "LensType"}, + { 0x0052, "LensSerialNumber"}, + { 0x0053, "AccessoryType"}, + { 0x0054, "AccessorySerialNumber"}, + { 0x0059, "Transform1"}, + { 0x005d, "IntelligentExposure"}, + { 0x0060, "LensFirmwareVersion"}, + { 0x0061, "FaceRecInfo"}, + { 0x0062, "FlashWarning"}, + { 0x0065, "Title"}, + { 0x0066, "BabyName"}, + { 0x0067, "Location"}, + { 0x0069, "Country"}, + { 0x006b, "State"}, + { 0x006d, "City"}, + { 0x006f, "Landmark"}, + { 0x0070, "IntelligentResolution"}, + { 0x0077, "BurstSheed"}, + { 0x0079, "IntelligentDRange"}, + { 0x007c, "ClearRetouch"}, + { 0x0080, "City2"}, + { 0x0086, "ManometerPressure"}, + { 0x0089, "PhotoStyle"}, + { 0x008a, "ShadingCompensation"}, + { 0x008c, "AccelerometerZ"}, + { 0x008d, "AccelerometerX"}, + { 0x008e, "AccelerometerY"}, + { 0x008f, "CameraOrientation"}, + { 0x0090, "RollAngle"}, + { 0x0091, "PitchAngle"}, + { 0x0093, "SweepPanoramaDirection"}, + { 0x0094, "PanoramaFieldOfView"}, + { 0x0096, "TimerRecording"}, + { 0x009d, "InternalNDFilter"}, + { 0x009e, "HDR"}, + { 0x009f, "ShutterType"}, + { 0x00a3, "ClearRetouchValue"}, + { 0x00ab, "TouchAE"}, + { 0x0e00, "PrintIM"}, + { 0x4449, "0x4449"}, + { 0x8000, "MakerNoteVersion"}, + { 0x8001, "SceneMode"}, + { 0x8004, "WBRedLevel"}, + { 0x8005, "WBGreenLevel"}, + { 0x8006, "WBBlueLevel"}, + { 0x8007, "FlashFired"}, + { 0x8008, "TextStamp3"}, + { 0x8009, "TextStamp4"}, + { 0x8010, "BabyAge2"}, + { 0x8012, "Transform2"}, + TAG_TABLE_END }; typedef enum mn_byte_order_t { @@ -1020,7 +1126,8 @@ 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} + { tag_table_VND_SAMSUNG, "SAMSUNG", NULL, NULL, 0, 0, MN_ORDER_NORMAL, MN_OFFSET_NORMAL}, + { tag_table_VND_PANASONIC, "Panasonic", NULL, "Panasonic\x00\x00\x00", 12, 12, MN_ORDER_NORMAL, MN_OFFSET_NORMAL} }; /* }}} */ diff --git a/ext/exif/tests/redhat-bug1362571.jpg b/ext/exif/tests/redhat-bug1362571.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35713e63a1201d0a8391e556580fb116ca252c6a GIT binary patch literal 16629 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 literal 0 HcmV?d00001 diff --git a/ext/exif/tests/redhat-bug1362571.phpt b/ext/exif/tests/redhat-bug1362571.phpt new file mode 100644 index 00000000000..ec69e38c91e --- /dev/null +++ b/ext/exif/tests/redhat-bug1362571.phpt @@ -0,0 +1,10 @@ +--TEST-- +Redhat bug #1362571 (PHP not returning full results for exif_read_data function) +--SKIPIF-- + +--FILE-- + 0); +?> +--EXPECT-- +bool(true)