Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: spf13/afero
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.2.0
Choose a base ref
...
head repository: spf13/afero
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.2.1
Choose a head ref
  • 1 commit
  • 2 files changed
  • 1 contributor

Commits on Jan 30, 2019

  1. Fix missing bounds checking in UnionFile.Readdir

    It will now return io.EOF at the end of the directory view.
    
    Fixes #194
    bep committed Jan 30, 2019
    Copy the full SHA
    f4711e4 View commit details
Showing with 81 additions and 0 deletions.
  1. +70 −0 composite_test.go
  2. +11 −0 unionFile.go
70 changes: 70 additions & 0 deletions composite_test.go
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ package afero
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"testing"
@@ -401,3 +402,72 @@ func TestCacheOnReadFsNotInLayer(t *testing.T) {
}
fh.Close()
}

// #194
func TestUniontFileReaddirEmpty(t *testing.T) {
osFs := NewOsFs()

base := NewMemMapFs()
overlay := NewMemMapFs()
ufs := &CopyOnWriteFs{base: base, layer: overlay}
mem := NewMemMapFs()

// The OS file will return io.EOF on end of directory.
for _, fs := range []Fs{osFs, ufs, mem} {
baseDir, err := TempDir(fs, "", "empty-dir")
if err != nil {
t.Fatal(err)
}

f, err := fs.Open(baseDir)
if err != nil {
t.Fatal(err)
}

names, err := f.Readdirnames(1)
if err != io.EOF {
t.Fatal(err)
}

if len(names) != 0 {
t.Fatal("should be empty")
}

f.Close()

fs.RemoveAll(baseDir)
}
}

func TestUniontFileReaddirAskForTooMany(t *testing.T) {
base := &MemMapFs{}
overlay := &MemMapFs{}

for i := 0; i < 5; i++ {
WriteFile(base, fmt.Sprintf("file%d.txt", i), []byte("afero"), 0777)
}

ufs := &CopyOnWriteFs{base: base, layer: overlay}

f, err := ufs.Open("")
if err != nil {
t.Fatal(err)
}

defer f.Close()

names, err := f.Readdirnames(6)
if err != nil {
t.Fatal(err)
}

if len(names) != 5 {
t.Fatal(names)
}

// End of directory
_, err = f.Readdirnames(3)
if err != io.EOF {
t.Fatal(err)
}
}
11 changes: 11 additions & 0 deletions unionFile.go
Original file line number Diff line number Diff line change
@@ -156,6 +156,7 @@ var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, err

// Readdir will weave the two directories together and
// return a single view of the overlayed directories
// At the end of the directory view, the error is io.EOF.
func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
var merge DirsMerger = f.Merger
if merge == nil {
@@ -185,9 +186,19 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
}
f.files = append(f.files, merged...)
}

if f.off >= len(f.files) {
return nil, io.EOF
}

if c == -1 {
return f.files[f.off:], nil
}

if c > len(f.files) {
c = len(f.files)
}

defer func() { f.off += c }()
return f.files[f.off:c], nil
}