返回 DeepSeek-Reasonix
confinedread_plan9.go
根目录 / internal / fileutil / confinedread_plan9.go
1 //go:build plan9
2
3 package fileutil
4
5 import (
6 "fmt"
7 "os"
8 "path/filepath"
9 "strings"
10 )
11
12 func OpenFileBeneath(root, rel string) (*os.File, error) {
13 root = filepath.Clean(strings.TrimSpace(root))
14 if root == "" || root == "." {
15 return nil, fmt.Errorf("workspace root is empty")
16 }
17 rel, err := confinedRelativePath(rel)
18 if err != nil {
19 return nil, err
20 }
21 target, err := filepath.EvalSymlinks(filepath.Join(root, rel))
22 if err != nil {
23 return nil, err
24 }
25 resolvedRoot, err := filepath.EvalSymlinks(root)
26 if err != nil {
27 return nil, err
28 }
29 resolvedRel, err := filepath.Rel(resolvedRoot, target)
30 if err != nil || resolvedRel == ".." || strings.HasPrefix(resolvedRel, ".."+string(filepath.Separator)) {
31 return nil, fmt.Errorf("file resolves outside workspace root")
32 }
33 return os.Open(target)
34 }
35
35 lines GO