diff --git a/cid.go b/cid.go index ae3d1fd..cc7c4b1 100644 --- a/cid.go +++ b/cid.go @@ -727,6 +727,10 @@ func CidFromReader(r io.Reader) (int, Cid, error) { // The varint package wants a io.ByteReader, so we must wrap our io.Reader. vers, err := varint.ReadUvarint(br) if err != nil { + if err == io.EOF { + // No data; not an invalid CID. + return 0, Undef, err + } return len(br.dst), Undef, ErrInvalidCid{err} } diff --git a/cid_test.go b/cid_test.go index 31989da..f0c6ad5 100644 --- a/cid_test.go +++ b/cid_test.go @@ -783,6 +783,20 @@ func TestBadCidInput(t *testing.T) { } } +func TestFromReaderNoData(t *testing.T) { + // Reading no data from io.Reader should return io.EOF, not ErrInvalidCid. + n, cid, err := CidFromReader(bytes.NewReader(nil)) + if err != io.EOF { + t.Fatal("Expected io.EOF error") + } + if cid != Undef { + t.Fatal("Expected Undef CID") + } + if n != 0 { + t.Fatal("Expected 0 data") + } +} + func TestBadParse(t *testing.T) { hash, err := mh.Sum([]byte("foobar"), mh.SHA3_256, -1) if err != nil {