fpexif: Fix IPTC crashing when reading a zero byte fillers at the end of IPTC segment (https://forum.lazarus.freepascal.org/index.php/topic,61832.msg466607.html#msg466607).

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8674 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2023-01-12 23:34:10 +00:00
parent afc2ee1f3a
commit 139d9f108b
6 changed files with 43 additions and 3 deletions

View File

@ -59,6 +59,9 @@
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>

View File

@ -41,6 +41,12 @@ const
FULLTAG_EXIFVERSION = TAGPARENT_EXIF or TAG_EXIFVERSION;
FULLTAG_FOCALLENGTH35mm = TAGPARENT_EXIF or TAG_FOCALLENGTH35mm;
EXIFTAG_IMAGEWIDTH = TAGPARENT_EXIF or TAG_IMAGEWIDTH;
EXIFTAG_IMAGELENGTH = TAGPARENT_EXIF or TAG_IMAGELENGTH;
EXIFTAG_COMPRESSION = TAGPARENT_EXIF or TAG_COMPRESSION;
EXIFTAG_MAKE = TAGPARENT_EXIF or TAG_MAKE;
EXIFTAG_MODEL = TAGPARENT_EXIF or TAG_MODEL;
type
TExifBeginReadingEvent = procedure of object;
TExifEndReadingEvent = procedure of object;
@ -314,13 +320,17 @@ begin
AddBinaryTag (I+$0002, 'InterOpVersion', 1, rsInterOpVersion, '', '', TVersionTag);
AddULongTag (P+$00FE, 'SubfileType', 1, '', rsSubfileTypeLkup, '', nil, true);
AddULongTag (P+$0100, 'ImageWidth', 1, rsImageWidth);
AddULongTag (E+$0100, 'ImageWidth', 1, rsImageWidth);
AddULongTag (T+$0100, 'ThumbnailWidth', 1, rsThumbnailWidth);
AddULongTag (P+$0101, 'ImageHeight', 1, rsImageHeight); // official: "Image length"
AddULongTag (E+$0101, 'ImageHeight', 1, rsImageHeight); // official: "Image length"
AddULongTag (T+$0101, 'ThumbnailHeight', 1, rsThumbnailHeight); // official: "Image length"
AddULongTag (P+$0101, 'ImageLength', 1, rsImageHeight);
AddULongTag (T+$0101, 'ThumbnailLength', 1, rsThumbnailHeight);
AddUShortTag (P+$0102, 'BitsPerSample', 1, rsBitsPerSample);
AddUShortTag (E+$0102, 'BitsPerSample', 1, rsBitsPerSample);
AddUShortTag (P+$0103, 'Compression', 1, rsCompression, rsCompressionLkup);
AddUShortTag (E+$0103, 'Compression', 1, rsCompression, rsCompressionLkup);
AddUShortTag (T+$0103, 'ThumbnailCompression', 1, rsCompression, rsCompressionLkup);
AddUShortTag (P+$0106, 'PhotometricInterpretation', 1, rsPhotometricInt, rsPhotometricIntLkup);
AddUShortTag (P+$0107, 'Thresholding', 1, rsThresholding, rsThresholdingLkup);
@ -330,9 +340,12 @@ begin
AddStringTag (P+$010D, 'DocumentName', 1, rsDocumentName);
AddStringTag (P+$010E, 'ImageDescription', 1, rsImageDescr);
AddStringTag (P+$010F, 'Make', 1, rsMake);
AddStringTag (E+$010F, 'Make', 1, rsMake);
AddStringTag (P+$0110, 'Model', 1, rsModel);
AddStringTag (E+$0110, 'Model', 1, rsModel);
AddULongTag (P+$0111, 'StripOffsets', 1, rsStripOffsets);
AddUShortTag (P+$0112, 'Orientation', 1, rsOrientation, rsOrientationLkup);
AddUShortTag (E+$0112, 'Orientation', 1, rsOrientation, rsOrientationLkup);
AddUShortTag (T+$0112, 'Orientation', 1, rsOrientation, rsOrientationLkup);
AddUShortTag (P+$0115, 'SamplesPerPixel', 1, rsSamplesPerPixel);
AddULongTag (P+$0116, 'RowsPerStrip', 1, rsRowsPerStrip);
@ -340,22 +353,28 @@ begin
AddUShortTag (P+$0118, 'MinSampleValue', 1, rsMinSampleValue);
AddUShortTag (P+$0119, 'MaxSampleValue', 1, rsMaxSampleValue);
AddURationalTag(P+$011A, 'XResolution', 1, rsXResolution);
AddURationalTag(E+$011A, 'XResolution', 1, rsXResolution);
AddURationalTag(T+$011A, 'ThumbnailXResolution', 1, rsXResolution);
AddURationalTag(P+$011B, 'YResolution', 1, rsYResolution);
AddURationalTag(E+$011B, 'YResolution', 1, rsYResolution);
AddURationalTag(T+$011B, 'ThumbnailYResolution', 1, rsYResolution);
AddUShortTag (P+$011C, 'PlanarConfiguration', 1, rsPlanarConfiguration, rsPlanarConfigurationLkup);
AddStringTag (P+$011D, 'PageName', 1, rsPageName);
AddURationalTag(P+$011E, 'XPosition', 1, rsXPosition);
AddURationalTag(P+$011F, 'YPosition', 1, rsYPosition);
AddUShortTag (P+$0128, 'ResolutionUnit', 1, rsResolutionUnit, rsResolutionUnitLkup);
AddUShortTag (E+$0128, 'ResolutionUnit', 1, rsResolutionUnit, rsResolutionUnitLkup);
AddUShortTag (T+$0128, 'ThumbnailResolutionUnit', 1, rsResolutionUnit, rsResolutionUnitLkup);
AddUShortTag (P+$0129, 'PageNumber', 2, rsPageNumber);
AddUShortTag (P+$012D, 'TransferFunction', 768, rsTransferFunction);
AddStringTag (P+$0131, 'Software', 1, rsSoftware);
AddStringTag (E+$0131, 'Software', 1, rsSoftware);
AddStringTag (T+$0131, 'Software', 1, rsSoftware);
AddStringTag (P+$0132, 'DateTime', 1, rsDateTime, '', TDateTimeTag);
AddStringTag (E+$0132, 'DateTime', 1, rsDateTime, '', TDateTimeTag);
AddStringTag (T+$0132, 'DateTime', 1, rsDateTime, '', TDateTimeTag);
AddStringTag (P+$013B, 'Artist', 1, rsArtist);
AddStringTag (E+$013B, 'Artist', 1, rsArtist);
AddStringTag (P+$013C, 'HostComputer', 1, rsHostComputer);
AddUShortTag (P+$013D, 'Predictor', 1, rsPredictor, rsPredictorLkup);
AddURationalTag(P+$013E, 'WhitePoint', 2, rsWhitePoint);
@ -377,6 +396,10 @@ begin
AddStringTag (I+$1000, 'RelatedImageFileFormat', 1, rsRelatedImageFileFormat);
AddUShortTag (I+$1001, 'RelatedImageWidth', 1, rsRelatedImageWidth);
AddUShortTag (I+$1002, 'RelatedImageHeight', 1, rsRelatedImageHeight);
AddUShortTag (P+$4746, 'Rating', 1, rsRating);
AddUShortTag (E+$4746, 'Rating', 1, rsRating);
AddUShortTag (P+$4749, 'RatingPercent', 1, rsRatingPercent);
AddUShortTag (E+$4749, 'RatingPercent', 1, rsRatingPercent);
AddStringTag (P+$8298, 'Copyright', 1, rsCopyright);
AddURationalTag(E+$829A, 'ExposureTime', 1, rsExposureTime, '', '', TExposureTimeTag); //, nil, '%0:.0f/%1:.0f s');
AddURationalTag(E+$829D, 'FNumber', 1, rsFNumber); //, nil, 'F/%2:.1f');
@ -438,7 +461,9 @@ begin
AddBinaryTag (E+$A000, 'FlashPixVersion', 1, rsFlashPixVersion, '', '', TVersionTag);
AddUShortTag (E+$A001, 'ColorSpace', 1, rsColorSpace, rsColorSpaceLkup);
AddUShortTag (E+$A002, 'ExifImageWidth', 1, rsExifImageWidth);
// AddUShortTag (T+$A002, 'ExifImageWidth', 1, rsExifImageWidth);
AddUShortTag (E+$A003, 'ExifImageHeight', 1, rsExifImageHeight); // is called "ExifImageLength" in Specs
// AddUShortTag (T+$A003, 'ExifImageHeight', 1, rsExifImageHeight); // is called "ExifImageLength" in Specs
AddStringTag (E+$A004, 'RelatedSoundFile', 1, rsRelatedSoundFile);
AddULongTag (E+$A005, 'InterOperabilityOffset', 1, rsInterOpOffset, '', '', TSubIFDTag, true);
AddURationalTag(E+$A20B, 'FlashEnergy', 1, rsFlashEnergy);

View File

@ -424,9 +424,9 @@ begin
// Special handling for some tags
case tag.TagID of
FULLTAG_MAKE:
FULLTAG_MAKE, EXIFTAG_MAKE:
FMake := tag.AsString;
FULLTAG_MODEL:
FULLTAG_MODEL, EXIFTAG_MODEL:
FModel := tag.AsString;
FULLTAG_THUMBSTARTOFFSET:
FThumbPosition := FStartPosition + FixEndian32(AIFDRecord.DataValue);

View File

@ -283,6 +283,8 @@ begin
start := 0;
while (start < High(ABuffer) - 1) do
begin
if ABuffer[start] = 0 then
break;
if ABuffer[start] <> $1C then
Error(rsNoValidIptcFile);

View File

@ -257,6 +257,8 @@ resourcestring
rsPressure = 'Pressure';
rsPrimaryChromaticities = 'Primary chromaticities';
rsQuality = 'Quality';
rsRating = 'Rating';
rsRatingPercent = 'Rating (%)';
rsRecExpIndex = 'Recommended exposure index';
rsRefBlackWhite = 'Reference black & white';
rsRelatedImageFileFormat = 'Related image file format';

View File

@ -573,7 +573,7 @@ msgid "Incorrect file structure"
msgstr "Falsche Dateistruktur"
#: fpestrconsts.rsincorrecttagtype
#, object-pascal-format
#, object-pascal-format, fuzzy, badformat
msgid "Incorrect tag type %d: Index=%d, TagID=$%.04x, File:\"%s\""
msgstr "Falscher Tag-Typ %d: Index=%d, TagID=$%.94x, Datei: \"%s\""
@ -857,6 +857,14 @@ msgstr "Qualität"
msgid "Range check error."
msgstr ""
#: fpestrconsts.rsrating
msgid "Rating"
msgstr ""
#: fpestrconsts.rsratingpercent
msgid "Rating (%)"
msgstr ""
#: fpestrconsts.rsreadincompleteifdrecord
#, object-pascal-format
msgid "Read incomplete IFD record at stream position %d."