mirror of
https://github.com/restic/restic.git
synced 2025-08-25 20:37:35 +00:00
fs/reader: return proper error on invalid filename
This commit is contained in:
@@ -42,9 +42,12 @@ type readerItem struct {
|
||||
// statically ensure that Local implements FS.
|
||||
var _ FS = &Reader{}
|
||||
|
||||
func NewReader(name string, r io.ReadCloser, opts ReaderOptions) *Reader {
|
||||
func NewReader(name string, r io.ReadCloser, opts ReaderOptions) (*Reader, error) {
|
||||
items := make(map[string]readerItem)
|
||||
name = readerCleanPath(name)
|
||||
if name == "/" {
|
||||
return nil, fmt.Errorf("invalid filename specified")
|
||||
}
|
||||
|
||||
isFile := true
|
||||
for {
|
||||
@@ -89,7 +92,7 @@ func NewReader(name string, r io.ReadCloser, opts ReaderOptions) *Reader {
|
||||
}
|
||||
return &Reader{
|
||||
items: items,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
func readerCleanPath(name string) string {
|
||||
|
@@ -185,15 +185,16 @@ func TestFSReader(t *testing.T) {
|
||||
tests = append(tests, createFileTest(filename, now, data)...)
|
||||
tests = append(tests, createDirTest("", now)...)
|
||||
|
||||
for _, test := range tests {
|
||||
fs := NewReader(filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
for _, tst := range tests {
|
||||
fs, err := NewReader(filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
Mode: 0644,
|
||||
Size: int64(len(data)),
|
||||
ModTime: now,
|
||||
})
|
||||
test.OK(t, err)
|
||||
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
test.f(t, fs)
|
||||
t.Run(tst.name, func(t *testing.T) {
|
||||
tst.f(t, fs)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -211,15 +212,16 @@ func TestFSReaderNested(t *testing.T) {
|
||||
tests = append(tests, createDirTest("foo", now)...)
|
||||
tests = append(tests, createDirTest("foo/sub", now)...)
|
||||
|
||||
for _, test := range tests {
|
||||
fs := NewReader(filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
for _, tst := range tests {
|
||||
fs, err := NewReader(filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
Mode: 0644,
|
||||
Size: int64(len(data)),
|
||||
ModTime: now,
|
||||
})
|
||||
test.OK(t, err)
|
||||
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
test.f(t, fs)
|
||||
t.Run(tst.name, func(t *testing.T) {
|
||||
tst.f(t, fs)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -244,12 +246,12 @@ func TestFSReaderDir(t *testing.T) {
|
||||
|
||||
for _, tst := range tests {
|
||||
t.Run(tst.name, func(t *testing.T) {
|
||||
fs := NewReader(tst.filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
fs, err := NewReader(tst.filename, io.NopCloser(bytes.NewReader(data)), ReaderOptions{
|
||||
Mode: 0644,
|
||||
Size: int64(len(data)),
|
||||
ModTime: now,
|
||||
})
|
||||
|
||||
test.OK(t, err)
|
||||
dir := path.Dir(tst.filename)
|
||||
for {
|
||||
if dir == "/" || dir == "." {
|
||||
@@ -294,12 +296,12 @@ func TestFSReaderMinFileSize(t *testing.T) {
|
||||
|
||||
for _, tst := range tests {
|
||||
t.Run(tst.name, func(t *testing.T) {
|
||||
fs := NewReader("testfile", io.NopCloser(strings.NewReader(tst.data)), ReaderOptions{
|
||||
fs, err := NewReader("testfile", io.NopCloser(strings.NewReader(tst.data)), ReaderOptions{
|
||||
Mode: 0644,
|
||||
ModTime: time.Now(),
|
||||
AllowEmptyFile: tst.allowEmpty,
|
||||
})
|
||||
|
||||
test.OK(t, err)
|
||||
f, err := fs.OpenFile("testfile", O_RDONLY, false)
|
||||
test.OK(t, err)
|
||||
|
||||
|
Reference in New Issue
Block a user