@@ -21,7 +21,7 @@ use strict;
2121use vars qw( $VERSION) ;
2222use Image::ExifTool qw( :DataAccess :Utils) ;
2323
24- $VERSION = ' 1.06 ' ;
24+ $VERSION = ' 1.07 ' ;
2525
2626sub ProcessProtobuf ($$$;$);
2727
@@ -59,12 +59,14 @@ sub VarInt($)
5959 my $val = ord ($buff ) & 0x7f;
6060 $$dirInfo {Bit0 } = $val & 0x01;
6161 my $mult = 128;
62+ my $i = 0;
6263 for (;;) {
6364 last unless ord ($buff ) & 0x80;
6465 $buff = GetBytes($dirInfo , 1);
6566 return undef unless defined $buff ;
6667 $val += (ord ($buff ) & 0x7f) * $mult ;
6768 last unless ord ($buff ) & 0x80;
69+ return undef if ++$i > 32; # set a reasonable limit
6870 $mult *= 128; # (Note: don't use integer bit shift to avoid integer overflow)
6971 }
7072 return $val ;
@@ -73,7 +75,7 @@ sub VarInt($)
7375# ------------------------------------------------------------------------------
7476# Read protobuf record
7577# Inputs: 0) dirInfo ref
76- # Returns: 0) record payload (plus tag id and format type in list context)
78+ # Returns: 0) record payload (plus tag id and format type in list context) or undef on error
7779# Notes: Updates $$dirInfo{Pos} to start of next record, and sets $$dirInfo{Bit0}
7880# according to the least significant bit of type 0 (varInt) records
7981sub ReadRecord ($)
@@ -138,7 +140,6 @@ sub ProcessProtobuf($$$;$)
138140
139141 $$dirInfo {Pos } = $$dirInfo {DirStart } || 0; # initialize buffer Pos
140142 $et -> VerboseDir(' Protobuf' , undef , $dirLen );
141-
142143 unless ($prefix ) {
143144 $prefix = ' ' ;
144145 $$et {ProtoPrefix }{$dirName } = ' ' unless defined $$et {ProtoPrefix }{$dirName };
0 commit comments