From de6c03deae1cf9c032be7f24b83bc7da7d139844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 16 Jul 2021 09:26:46 +0100 Subject: [PATCH] amend the CidFromReader slice extension math The append+make slice extension idiom works, but note that append uses the slice's length as its base. We need to append the number of bytes required for length to reach cidLength, not the capacity. The added test case panicked before this change, and works now: --- FAIL: TestReadCidsFromBuffer (0.00s) panic: runtime error: slice bounds out of range [:73] with capacity 64 [recovered] panic: runtime error: slice bounds out of range [:73] with capacity 64 goroutine 37 [running]: testing.tRunner.func1.2({0x570d60, 0xc000016438}) testing/testing.go:1203 +0x24e testing.tRunner.func1() testing/testing.go:1206 +0x218 panic({0x570d60, 0xc000016438}) runtime/panic.go:1038 +0x215 github.com/ipfs/go-cid.CidFromReader({0x5b0e20, 0xc000010900}) github.com/ipfs/go-cid/cid.go:803 +0x75f github.com/ipfs/go-cid.TestReadCidsFromBuffer(0xc00014ba00) github.com/ipfs/go-cid/cid_test.go:710 +0x625 testing.tRunner(0xc00014ba00, 0x58af38) testing/testing.go:1253 +0x102 created by testing.(*T).Run testing/testing.go:1300 +0x35a exit status 2 FAIL github.com/ipfs/go-cid 0.004s --- cid.go | 2 +- cid_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cid.go b/cid.go index 6ff505c..dc80750 100644 --- a/cid.go +++ b/cid.go @@ -793,7 +793,7 @@ func CidFromReader(r io.Reader) (int, Cid, error) { if cidLength > cap(br.dst) { // If the multihash digest doesn't fit in our initial 64 bytes, // efficiently extend the slice via append+make. - br.dst = append(br.dst, make([]byte, cidLength-cap(br.dst))...) + br.dst = append(br.dst, make([]byte, cidLength-len(br.dst))...) } else { // The multihash digest fits inside our buffer, // so just extend its capacity. diff --git a/cid_test.go b/cid_test.go index 161e6dc..1e40883 100644 --- a/cid_test.go +++ b/cid_test.go @@ -667,6 +667,7 @@ func TestReadCidsFromBuffer(t *testing.T) { "k2cwueckqkibutvhkr4p2ln2pjcaxaakpd9db0e7j7ax1lxhhxy3ekpv", "Qmf5Qzp6nGBku7CEn2UQx4mgN8TW69YUok36DrGa6NN893", "zb2rhZi1JR4eNc2jBGaRYJKYM8JEB4ovenym8L1CmFsRAytkz", + "bafkqarjpmzuwyzltorxxezjpkvcfgqkfjfbfcvslivje2vchkzdu6rckjjcfgtkolaze6mssjqzeyn2ekrcfatkjku2vowseky3fswkfkm2deqkrju3e2", } var cids []Cid