summaryrefslogtreecommitdiffhomepage
path: root/runsc
diff options
context:
space:
mode:
Diffstat (limited to 'runsc')
-rw-r--r--runsc/fsgofer/fsgofer.go57
-rw-r--r--runsc/fsgofer/fsgofer_test.go10
2 files changed, 13 insertions, 54 deletions
diff --git a/runsc/fsgofer/fsgofer.go b/runsc/fsgofer/fsgofer.go
index b81ede5ae..e04ddda47 100644
--- a/runsc/fsgofer/fsgofer.go
+++ b/runsc/fsgofer/fsgofer.go
@@ -21,7 +21,6 @@
package fsgofer
import (
- "errors"
"fmt"
"io"
"math"
@@ -59,6 +58,9 @@ var verityXattrs = map[string]struct{}{
// join is equivalent to path.Join() but skips path.Clean() which is expensive.
func join(parent, child string) string {
+ if child == "." || child == ".." {
+ panic(fmt.Sprintf("invalid child path %q", child))
+ }
return parent + "/" + child
}
@@ -1224,56 +1226,3 @@ func (l *localFile) checkROMount() error {
}
return nil
}
-
-func (l *localFile) MultiGetAttr(names []string) ([]p9.FullStat, error) {
- stats := make([]p9.FullStat, 0, len(names))
-
- if len(names) > 0 && names[0] == "" {
- qid, valid, attr, err := l.GetAttr(p9.AttrMask{})
- if err != nil {
- return nil, err
- }
- stats = append(stats, p9.FullStat{
- QID: qid,
- Valid: valid,
- Attr: attr,
- })
- names = names[1:]
- }
-
- parent := l.file.FD()
- for _, name := range names {
- child, err := unix.Openat(parent, name, openFlags|unix.O_PATH, 0)
- if parent != l.file.FD() {
- // Parent is no longer needed.
- _ = unix.Close(parent)
- }
- if err != nil {
- if errors.Is(err, unix.ENOENT) {
- // No pont in continuing any further.
- break
- }
- return nil, err
- }
-
- var stat unix.Stat_t
- if err := unix.Fstat(child, &stat); err != nil {
- _ = unix.Close(child)
- return nil, err
- }
- valid, attr := l.fillAttr(&stat)
- stats = append(stats, p9.FullStat{
- QID: l.attachPoint.makeQID(&stat),
- Valid: valid,
- Attr: attr,
- })
- if (stat.Mode & unix.S_IFMT) != unix.S_IFDIR {
- // Doesn't need to continue if entry is not a dir. Including symlinks
- // that cannot be followed.
- _ = unix.Close(child)
- break
- }
- parent = child
- }
- return stats, nil
-}
diff --git a/runsc/fsgofer/fsgofer_test.go b/runsc/fsgofer/fsgofer_test.go
index 77723827a..d7e141476 100644
--- a/runsc/fsgofer/fsgofer_test.go
+++ b/runsc/fsgofer/fsgofer_test.go
@@ -703,6 +703,16 @@ func TestWalkNotFound(t *testing.T) {
})
}
+func TestWalkPanic(t *testing.T) {
+ runCustom(t, []uint32{unix.S_IFDIR}, allConfs, func(t *testing.T, s state) {
+ for _, name := range []string{".", ".."} {
+ assertPanic(t, func() {
+ s.file.Walk([]string{name})
+ })
+ }
+ })
+}
+
func TestWalkDup(t *testing.T) {
runAll(t, func(t *testing.T, s state) {
_, dup, err := s.file.Walk([]string{})