diff --git a/fmp/fmp_chunk.go b/fmp/fmp_chunk.go index 7103bad..3d53956 100644 --- a/fmp/fmp_chunk.go +++ b/fmp/fmp_chunk.go @@ -167,19 +167,21 @@ func (ctx *FmpFile) readChunk(payload []byte) (*FmpChunk, error) { if payload[0] == 0x07 { length := binary.BigEndian.Uint16(payload[2 : 2+2]) + payloadLimit := min(4+length, uint16(len(payload))) return &FmpChunk{ Type: FMP_CHUNK_SEGMENTED_DATA, Index: uint32(payload[1]), - Value: payload[4 : 4+length], + Value: payload[4:payloadLimit], Length: 4 + uint32(length), }, nil } if payload[0] == 0x0F { length := uint32(binary.BigEndian.Uint16(payload[3 : 3+2])) + payloadLimit := min(5+length, uint32(len(payload))) return &FmpChunk{ Type: FMP_CHUNK_SEGMENTED_DATA, Index: uint32(binary.BigEndian.Uint16(payload[1 : 1+2])), - Value: payload[5 : 5+length], + Value: payload[5:payloadLimit], Length: 5 + length, }, nil } diff --git a/fmp/fmp_file.go b/fmp/fmp_file.go index 5554553..6ebb09e 100644 --- a/fmp/fmp_file.go +++ b/fmp/fmp_file.go @@ -137,7 +137,10 @@ func (ctx *FmpFile) readSector() (*FmpSector, error) { if chunk.Length == 0 { panic("chunk length not set") } - payload = payload[chunk.Length:] + payload = payload[min(chunk.Length, uint32(len(payload))):] + if len(payload) == 0 { + break + } } return sector, nil