diff --git a/v2/ifd_enumerate.go b/v2/ifd_enumerate.go index 1359333..ed8b805 100644 --- a/v2/ifd_enumerate.go +++ b/v2/ifd_enumerate.go @@ -77,6 +77,7 @@ type byteParser struct { byteOrder binary.ByteOrder addressableData []byte ifdOffset uint32 + buffer *bytes.Buffer currentOffset uint32 } @@ -90,6 +91,7 @@ func newByteParser(addressableData []byte, byteOrder binary.ByteOrder, ifdOffset bp = &byteParser{ addressableData: addressableData, byteOrder: byteOrder, + buffer: bytes.NewBuffer(addressableData[ifdOffset:]), currentOffset: ifdOffset, } @@ -109,12 +111,16 @@ func (bp *byteParser) getUint16() (value uint16, raw []byte, err error) { // TODO(dustin): Add test needBytes := 2 + offset := 0 + raw = make([]byte, needBytes) - if bp.currentOffset+needBytes >= len(bp.addressableData) { - return 0, nil, io.EOF + for offset < needBytes { + n, err := bp.buffer.Read(raw[offset:]) + log.PanicIf(err) + + offset += n } - raw = addressableData[bp.currentOffset : bp.currentOffset+needBytes] value = bp.byteOrder.Uint16(raw) bp.currentOffset += uint32(needBytes) @@ -135,13 +141,17 @@ func (bp *byteParser) getUint32() (value uint32, raw []byte, err error) { // TODO(dustin): Add test needBytes := 4 + offset := 0 + raw = make([]byte, needBytes) - if bp.currentOffset+needBytes >= len(bp.addressableData) { - return 0, nil, io.EOF + for offset < needBytes { + n, err := bp.buffer.Read(raw[offset:]) + log.PanicIf(err) + + offset += n } - raw = addressableData[bp.currentOffset : bp.currentOffset+needBytes] - value = bp.byteOrder.Uint16(raw) + value = bp.byteOrder.Uint32(raw) bp.currentOffset += uint32(needBytes) @@ -158,6 +168,7 @@ func (bp *byteParser) CurrentOffset() uint32 { // containers in the EXIF blob. type IfdEnumerate struct { exifData []byte + buffer *bytes.Buffer byteOrder binary.ByteOrder tagIndex *TagIndex ifdMapping *exifcommon.IfdMapping @@ -168,6 +179,7 @@ type IfdEnumerate struct { func NewIfdEnumerate(ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, byteOrder binary.ByteOrder) *IfdEnumerate { return &IfdEnumerate{ exifData: exifData, + buffer: bytes.NewBuffer(exifData), byteOrder: byteOrder, ifdMapping: ifdMapping, tagIndex: tagIndex,