From e0ce96b49e0ed20822610731e3b46c347014f968 Mon Sep 17 00:00:00 2001 From: Dustin Oprea Date: Thu, 9 Jul 2020 16:19:59 -0400 Subject: [PATCH] Revert "Revert "ifd_enumerate.go: Eliminate unnecessary buffering"" This reverts commit 3bd3dd677b48b9472eb6ac821a0501e24aa89e46. Includes fixes. --- v2/ifd_builder_encode_test.go | 24 ++++++++++++------------ v2/ifd_enumerate.go | 29 +++++++++-------------------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/v2/ifd_builder_encode_test.go b/v2/ifd_builder_encode_test.go index b7088af..0e30bdf 100644 --- a/v2/ifd_builder_encode_test.go +++ b/v2/ifd_builder_encode_test.go @@ -183,8 +183,8 @@ func Test_IfdByteEncoder_encodeTagToBytes_bytes_embedded1(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() @@ -352,8 +352,8 @@ func Test_IfdByteEncoder_encodeTagToBytes_childIfd__withAllocate(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() @@ -473,8 +473,8 @@ func Test_IfdByteEncoder_encodeTagToBytes_simpleTag_allocate(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() @@ -617,8 +617,8 @@ func Test_IfdByteEncoder_encodeIfdToBytes_fullExif(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() @@ -667,8 +667,8 @@ func Test_IfdByteEncoder_EncodeToExifPayload(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() @@ -718,8 +718,8 @@ func Test_IfdByteEncoder_EncodeToExif_WithChildAndSibling(t *testing.T) { defer func() { if state := recover(); state != nil { err := log.Wrap(state.(error)) - log.PrintErrorf(err, "Test failure.") - panic(err) + log.PrintError(err) + t.Fatalf("Test failed.") } }() diff --git a/v2/ifd_enumerate.go b/v2/ifd_enumerate.go index ed8b805..ef49ab8 100644 --- a/v2/ifd_enumerate.go +++ b/v2/ifd_enumerate.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "io" "strconv" "strings" "time" @@ -77,7 +78,6 @@ type byteParser struct { byteOrder binary.ByteOrder addressableData []byte ifdOffset uint32 - buffer *bytes.Buffer currentOffset uint32 } @@ -91,7 +91,6 @@ func newByteParser(addressableData []byte, byteOrder binary.ByteOrder, ifdOffset bp = &byteParser{ addressableData: addressableData, byteOrder: byteOrder, - buffer: bytes.NewBuffer(addressableData[ifdOffset:]), currentOffset: ifdOffset, } @@ -110,17 +109,13 @@ func (bp *byteParser) getUint16() (value uint16, raw []byte, err error) { // TODO(dustin): Add test - needBytes := 2 - offset := 0 - raw = make([]byte, needBytes) + needBytes := uint32(2) - for offset < needBytes { - n, err := bp.buffer.Read(raw[offset:]) - log.PanicIf(err) - - offset += n + if bp.currentOffset+needBytes > uint32(len(bp.addressableData)) { + return 0, nil, io.EOF } + raw = bp.addressableData[bp.currentOffset : bp.currentOffset+needBytes] value = bp.byteOrder.Uint16(raw) bp.currentOffset += uint32(needBytes) @@ -140,17 +135,13 @@ func (bp *byteParser) getUint32() (value uint32, raw []byte, err error) { // TODO(dustin): Add test - needBytes := 4 - offset := 0 - raw = make([]byte, needBytes) + needBytes := uint32(4) - for offset < needBytes { - n, err := bp.buffer.Read(raw[offset:]) - log.PanicIf(err) - - offset += n + if bp.currentOffset+needBytes > uint32(len(bp.addressableData)) { + return 0, nil, io.EOF } + raw = bp.addressableData[bp.currentOffset : bp.currentOffset+needBytes] value = bp.byteOrder.Uint32(raw) bp.currentOffset += uint32(needBytes) @@ -168,7 +159,6 @@ 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 @@ -179,7 +169,6 @@ 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,