exiftool_vendored 12.56.0 → 12.57.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.56';
32
+ $VERSION = '12.57';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -2043,6 +2043,7 @@ sub new
2043
2043
  $$self{DEL_GROUP} = { }; # lookup for groups to delete when writing
2044
2044
  $$self{SAVE_COUNT} = 0; # count calls to SaveNewValues()
2045
2045
  $$self{FILE_SEQUENCE} = 0; # sequence number for files when reading
2046
+ $$self{FILES_WRITTEN} = 0; # count of files successfully written
2046
2047
  $$self{INDENT2} = ''; # indentation of verbose messages from SetNewValue
2047
2048
 
2048
2049
  # initialize our new groups for writing
@@ -7988,7 +7989,7 @@ sub ProcessDirectory($$$;$)
7988
7989
  # patch for bug in Windows phone 7.5 O/S that writes incorrect InteropIFD pointer
7989
7990
  return 0 unless $dirName eq 'GPS' and $$self{PROCESSED}{$addr} eq 'InteropIFD';
7990
7991
  }
7991
- $$self{PROCESSED}{$addr} = $dirName;
7992
+ $$self{PROCESSED}{$addr} = $dirName unless $$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ALLOW_REPROCESS};
7992
7993
  }
7993
7994
  my $oldOrder = GetByteOrder();
7994
7995
  my @save = @$self{'INDENT','DIR_NAME','Compression','SubfileType'};
@@ -8749,13 +8750,16 @@ sub ProcessBinaryData($$$)
8749
8750
  {
8750
8751
  my ($self, $dirInfo, $tagTablePtr) = @_;
8751
8752
  my $dataPt = $$dirInfo{DataPt};
8752
- my $offset = $$dirInfo{DirStart} || 0;
8753
- my $size = $$dirInfo{DirLen} || (length($$dataPt) - $offset);
8753
+ my $dataLen = length $$dataPt;
8754
+ my $dirStart = $$dirInfo{DirStart} || 0;
8755
+ my $maxLen = $dataLen - $dirStart;
8756
+ my $size = $$dirInfo{DirLen};
8754
8757
  my $base = $$dirInfo{Base} || 0;
8755
8758
  my $verbose = $$self{OPTIONS}{Verbose};
8756
8759
  my $unknown = $$self{OPTIONS}{Unknown};
8757
8760
  my $dataPos = $$dirInfo{DataPos} || 0;
8758
8761
 
8762
+ $size = $maxLen if not defined $size or $size > $maxLen;
8759
8763
  # get default format ('int8u' unless specified)
8760
8764
  my $defaultFormat = $$tagTablePtr{FORMAT} || 'int8u';
8761
8765
  my $increment = $formatSize{$defaultFormat};
@@ -8797,6 +8801,7 @@ sub ProcessBinaryData($$$)
8797
8801
  $tagInfo = $self->GetTagInfo($tagTablePtr, $index);
8798
8802
  unless ($tagInfo) {
8799
8803
  next unless defined $tagInfo;
8804
+ # $entry = offset of value relative to directory start (or end if negative)
8800
8805
  my $entry = int($index) * $increment + $varSize;
8801
8806
  if ($entry < 0) {
8802
8807
  $entry += $size;
@@ -8805,7 +8810,7 @@ sub ProcessBinaryData($$$)
8805
8810
  next if $entry >= $size;
8806
8811
  my $more = $size - $entry;
8807
8812
  $more = 128 if $more > 128;
8808
- my $v = substr($$dataPt, $entry+$offset, $more);
8813
+ my $v = substr($$dataPt, $entry+$dirStart, $more);
8809
8814
  $tagInfo = $self->GetTagInfo($tagTablePtr, $index, \$v);
8810
8815
  next unless $tagInfo;
8811
8816
  }
@@ -8838,7 +8843,7 @@ sub ProcessBinaryData($$$)
8838
8843
  $count = $more;
8839
8844
  } elsif ($format eq 'pstring') {
8840
8845
  $format = 'string';
8841
- $count = Get8u($dataPt, ($entry++)+$offset);
8846
+ $count = Get8u($dataPt, ($entry++)+$dirStart);
8842
8847
  --$more;
8843
8848
  } elsif (not $formatSize{$format}) {
8844
8849
  if ($format =~ /(.*)\[(.*)\]/) {
@@ -8867,17 +8872,17 @@ sub ProcessBinaryData($$$)
8867
8872
  } elsif ($format =~ /^var_/) {
8868
8873
  # handle variable-length string formats
8869
8874
  $format = substr($format, 4);
8870
- pos($$dataPt) = $entry + $offset;
8875
+ pos($$dataPt) = $entry + $dirStart;
8871
8876
  undef $count;
8872
8877
  if ($format eq 'ustring') {
8873
- $count = pos($$dataPt) - ($entry+$offset) if $$dataPt =~ /\G(..)*?\0\0/sg;
8878
+ $count = pos($$dataPt) - ($entry+$dirStart) if $$dataPt =~ /\G(..)*?\0\0/sg;
8874
8879
  $varSize -= 2; # ($count includes base size of 2 bytes)
8875
8880
  } elsif ($format eq 'pstring') {
8876
- $count = Get8u($dataPt, ($entry++)+$offset);
8881
+ $count = Get8u($dataPt, ($entry++)+$dirStart);
8877
8882
  --$more;
8878
8883
  } elsif ($format eq 'pstr32' or $format eq 'ustr32') {
8879
8884
  last if $more < 4;
8880
- $count = Get32u($dataPt, $entry + $offset);
8885
+ $count = Get32u($dataPt, $entry + $dirStart);
8881
8886
  $count *= 2 if $format eq 'ustr32';
8882
8887
  $entry += 4;
8883
8888
  $more -= 4;
@@ -8885,22 +8890,22 @@ sub ProcessBinaryData($$$)
8885
8890
  } elsif ($format eq 'int16u') {
8886
8891
  # int16u size of binary data to follow
8887
8892
  last if $more < 2;
8888
- $count = Get16u($dataPt, $entry + $offset) + 2;
8893
+ $count = Get16u($dataPt, $entry + $dirStart) + 2;
8889
8894
  $varSize -= 2; # ($count includes size word)
8890
8895
  $format = 'undef';
8891
8896
  } elsif ($format eq 'ue7') {
8892
8897
  require Image::ExifTool::BPG;
8893
- ($val, $count) = Image::ExifTool::BPG::Get_ue7($dataPt, $entry + $offset);
8898
+ ($val, $count) = Image::ExifTool::BPG::Get_ue7($dataPt, $entry + $dirStart);
8894
8899
  last unless defined $val;
8895
8900
  --$varSize; # ($count includes base size of 1 byte)
8896
8901
  } elsif ($$dataPt =~ /\0/g) {
8897
- $count = pos($$dataPt) - ($entry+$offset);
8902
+ $count = pos($$dataPt) - ($entry+$dirStart);
8898
8903
  --$varSize; # ($count includes base size of 1 byte)
8899
8904
  }
8900
8905
  $count = $more if not defined $count or $count > $more;
8901
8906
  $varSize += $count; # shift subsequent indices
8902
8907
  unless (defined $val) {
8903
- $val = substr($$dataPt, $entry+$offset, $count);
8908
+ $val = substr($$dataPt, $entry+$dirStart, $count);
8904
8909
  $val = $self->Decode($val, 'UCS2') if $format eq 'ustring' or $format eq 'ustr32';
8905
8910
  $val =~ s/\0.*//s unless $format eq 'undef'; # truncate at null
8906
8911
  }
@@ -8914,7 +8919,7 @@ sub ProcessBinaryData($$$)
8914
8919
  # hook to allow format, etc to be set dynamically
8915
8920
  if (defined $$tagInfo{Hook}) {
8916
8921
  my $oldVarSize = $varSize;
8917
- my $pos = $entry + $offset;
8922
+ my $pos = $entry + $dirStart;
8918
8923
  #### eval Hook ($format, $varSize, $size, $dataPt, $pos)
8919
8924
  eval $$tagInfo{Hook};
8920
8925
  # save variable size data if required for writing (in case changed by Hook)
@@ -8939,7 +8944,7 @@ sub ProcessBinaryData($$$)
8939
8944
  next if $$tagInfo{LargeTag} and $$self{EXCL_TAG_LOOKUP}{lc $$tagInfo{Name}};
8940
8945
  # read value now if necessary
8941
8946
  unless (defined $val and not $$tagInfo{SubDirectory}) {
8942
- $val = ReadValue($dataPt, $entry+$offset, $format, $count, $more, \$rational);
8947
+ $val = ReadValue($dataPt, $entry+$dirStart, $format, $count, $more, \$rational);
8943
8948
  next unless defined $val;
8944
8949
  $mask = $$tagInfo{Mask};
8945
8950
  $val = ($val & $mask) >> $$tagInfo{BitShift} if $mask;
@@ -8956,8 +8961,8 @@ sub ProcessBinaryData($$$)
8956
8961
  Value => $val,
8957
8962
  DataPt => $dataPt,
8958
8963
  Size => $len,
8959
- Start => $entry+$offset,
8960
- Addr => $entry+$offset+$base+$dataPos,
8964
+ Start => $entry+$dirStart,
8965
+ Addr => $entry+$dirStart+$base+$dataPos,
8961
8966
  Format => $format,
8962
8967
  Count => $count,
8963
8968
  Extra => $mask ? sprintf(', mask 0x%.2x',$mask) : undef,
@@ -8983,16 +8988,27 @@ sub ProcessBinaryData($$$)
8983
8988
  my $subdirBase = $base;
8984
8989
  if (defined $$subdir{Base}) {
8985
8990
  #### eval Base ($start,$base)
8986
- my $start = $entry + $offset + $dataPos;
8991
+ my $start = $entry + $dirStart + $dataPos;
8987
8992
  $subdirBase = eval($$subdir{Base}) + $base;
8988
8993
  }
8989
8994
  my $start = $$subdir{Start} || 0;
8995
+ if ($start =~ /\$/) {
8996
+ # ignore directories with a zero offset (ie. missing Nikon ShotInfo entries)
8997
+ next unless $val;
8998
+ #### eval Start ($val, $dirStart)
8999
+ $start = eval($start);
9000
+ next if $start < $dirStart or $start > $dataLen;
9001
+ $len = $$subdir{DirLen};
9002
+ $len = $dataLen - $start unless $len and $len <= $dataLen - $start;
9003
+ } else {
9004
+ $start += $dirStart + $entry;
9005
+ }
8990
9006
  my %subdirInfo = (
8991
9007
  DataPt => $dataPt,
8992
9008
  DataPos => $dataPos,
8993
- DataLen => length $$dataPt,
8994
- DirStart => $entry + $offset + $start,
8995
- DirLen => $len - $start,
9009
+ DataLen => $dataLen,
9010
+ DirStart => $start,
9011
+ DirLen => $len,
8996
9012
  Base => $subdirBase,
8997
9013
  );
8998
9014
  delete $$self{NO_UNKNOWN};
@@ -2327,9 +2327,9 @@ CBOR, CIFF, CameraIFD, Canon, CanonCustom, CanonDR4, CanonRaw, CanonVRD,
2327
2327
  Casio, Chapter#, Composite, DICOM, DJI, DNG, DV, DjVu, DjVu-Meta, Ducky,
2328
2328
  EPPIM, EXE, EXIF, ExifIFD, ExifTool, FITS, FLAC, FLIR, File, Flash,
2329
2329
  FlashPix, Font, FotoStation, FujiFilm, FujiIFD, GE, GIF, GIMP, GPS,
2330
- GSpherical, GeoTiff, GlobParamIFD, GoPro, GraphConv, H264, HP, HTC, HTML,
2331
- HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv, ICC-chrm,
2332
- ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile,
2330
+ GSpherical, Garmin, GeoTiff, GlobParamIFD, GoPro, GraphConv, H264, HP, HTC,
2331
+ HTML, HTML-dc, HTML-ncc, HTML-office, HTML-prod, HTML-vw96, HTTP-equiv,
2332
+ ICC-chrm, ICC-clrt, ICC-header, ICC-meas, ICC-meta, ICC-view, ICC_Profile,
2333
2333
  ICC_Profile#, ID3, ID3v1, ID3v1_Enh, ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1,
2334
2334
  IPTC, IPTC#, ISO, ITC, InfiRay, Insta360, InteropIFD, ItemList, JFIF, JFXX,
2335
2335
  JPEG, JPEG-HDR, JPS, JSON, JUMBF, JVC, Jpeg2000, KDC_IFD, Keys, Kodak,
@@ -2349,7 +2349,7 @@ RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP,
2349
2349
  Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2,
2350
2350
  SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw,
2351
2351
  Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData,
2352
- VCalendar, VCard, Version0, VNote, Vorbis, WTV, XML, XMP, XMP-DICOM,
2352
+ VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM,
2353
2353
  XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth, XMP-GFocus,
2354
2354
  XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1,
2355
2355
  XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi, XMP-ast,
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.56
3
+ Version: 12.57
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('12.56.0')
4
+ VERSION = Gem::Version.new('12.57.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.56.0
4
+ version: 12.57.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-09 00:00:00.000000000 Z
12
+ date: 2023-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool