@cryptotaxi247 / kubo / commits / 2eca66e6d

off by one error seeking to end of single block file

Jeromy committed Jan 27, 2015 at 07:41 UTC 2eca66e6d212ecd8d68191e6d429a2b3a22e1f4e
2 files changed +53 -1
importer/importer_test.go
+52
@@ -308,6 +308,58 @@ func TestSeekToAlmostBegin(t *testing.T) {
308 }
309 }
310
311 +func TestSeekEnd(t *testing.T) {
312 + nbytes := int64(50 * 1024)
313 + should := make([]byte, nbytes)
314 + u.NewTimeSeededRand().Read(should)
315 +
316 + read := bytes.NewReader(should)
317 + dnp := getDagservAndPinner(t)
318 + nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{500})
319 + if err != nil {
320 + t.Fatal(err)
321 + }
322 +
323 + rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds)
324 + if err != nil {
325 + t.Fatal(err)
326 + }
327 +
328 + seeked, err := rs.Seek(0, os.SEEK_END)
329 + if err != nil {
330 + t.Fatal(err)
331 + }
332 + if seeked != nbytes {
333 + t.Fatal("Failed to seek to end")
334 + }
335 +}
336 +
337 +func TestSeekEndSingleBlockFile(t *testing.T) {
338 + nbytes := int64(100)
339 + should := make([]byte, nbytes)
340 + u.NewTimeSeededRand().Read(should)
341 +
342 + read := bytes.NewReader(should)
343 + dnp := getDagservAndPinner(t)
344 + nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{5000})
345 + if err != nil {
346 + t.Fatal(err)
347 + }
348 +
349 + rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds)
350 + if err != nil {
351 + t.Fatal(err)
352 + }
353 +
354 + seeked, err := rs.Seek(0, os.SEEK_END)
355 + if err != nil {
356 + t.Fatal(err)
357 + }
358 + if seeked != nbytes {
359 + t.Fatal("Failed to seek to end")
360 + }
361 +}
362 +
363 func TestSeekingStress(t *testing.T) {
364 nbytes := int64(1024 * 1024)
365 should := make([]byte, nbytes)
unixfs/io/dagreader.go
+1 -1
@@ -171,7 +171,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) {
171
172 // left represents the number of bytes remaining to seek to (from beginning)
173 left := offset
174 - if int64(len(pb.Data)) > offset {
174 + if int64(len(pb.Data)) >= offset {
175 // Close current buf to close potential child dagreader
176 dr.buf.Close()
177 dr.buf = NewRSNCFromBytes(pb.GetData()[offset:])