From 2eca66e6d212ecd8d68191e6d429a2b3a22e1f4e Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Jan 2015 07:41:51 +0000 Subject: [PATCH] off by one error seeking to end of single block file --- importer/importer_test.go | 52 +++++++++++++++++++++++++++++++++++++++ unixfs/io/dagreader.go | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/importer/importer_test.go b/importer/importer_test.go index 57f44795c..8a70cec93 100644 --- a/importer/importer_test.go +++ b/importer/importer_test.go @@ -308,6 +308,58 @@ func TestSeekToAlmostBegin(t *testing.T) { } } +func TestSeekEnd(t *testing.T) { + nbytes := int64(50 * 1024) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + dnp := getDagservAndPinner(t) + nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{500}) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, os.SEEK_END) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + +func TestSeekEndSingleBlockFile(t *testing.T) { + nbytes := int64(100) + should := make([]byte, nbytes) + u.NewTimeSeededRand().Read(should) + + read := bytes.NewReader(should) + dnp := getDagservAndPinner(t) + nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{5000}) + if err != nil { + t.Fatal(err) + } + + rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds) + if err != nil { + t.Fatal(err) + } + + seeked, err := rs.Seek(0, os.SEEK_END) + if err != nil { + t.Fatal(err) + } + if seeked != nbytes { + t.Fatal("Failed to seek to end") + } +} + func TestSeekingStress(t *testing.T) { nbytes := int64(1024 * 1024) should := make([]byte, nbytes) diff --git a/unixfs/io/dagreader.go b/unixfs/io/dagreader.go index 8d1c87507..15e1b6f6e 100644 --- a/unixfs/io/dagreader.go +++ b/unixfs/io/dagreader.go @@ -171,7 +171,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) { // left represents the number of bytes remaining to seek to (from beginning) left := offset - if int64(len(pb.Data)) > offset { + if int64(len(pb.Data)) >= offset { // Close current buf to close potential child dagreader dr.buf.Close() dr.buf = NewRSNCFromBytes(pb.GetData()[offset:])