Skip to content

Commit d8ff7a4

Browse files
author
Zhou Hao
authored
Merge pull request #643 from kinvolk/dongsu/test-masked-paths
validation: add more test cases for masked paths tests
2 parents f256851 + a6e6aff commit d8ff7a4

File tree

1 file changed

+141
-7
lines changed

1 file changed

+141
-7
lines changed

validation/linux_masked_paths.go

+141-7
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,39 @@
11
package main
22

33
import (
4+
"fmt"
45
"io/ioutil"
56
"os"
67
"path/filepath"
78

89
"github.com/opencontainers/runtime-tools/validation/util"
10+
"golang.org/x/sys/unix"
911
)
1012

11-
func main() {
13+
func checkMaskedPaths() error {
1214
g, err := util.GetDefaultGenerator()
1315
if err != nil {
14-
util.Fatal(err)
16+
return err
1517
}
16-
g.AddLinuxMaskedPaths("/masked-dir")
17-
g.AddLinuxMaskedPaths("/masked-file")
18+
19+
maskedDir := "masked-dir"
20+
maskedSubDir := "masked-subdir"
21+
maskedFile := "masked-file"
22+
23+
maskedDirTop := filepath.Join("/", maskedDir)
24+
maskedFileTop := filepath.Join("/", maskedFile)
25+
26+
maskedDirSub := filepath.Join(maskedDirTop, maskedSubDir)
27+
maskedFileSub := filepath.Join(maskedDirTop, maskedFile)
28+
maskedFileSubSub := filepath.Join(maskedDirSub, maskedFile)
29+
30+
g.AddLinuxMaskedPaths(maskedDirTop)
31+
g.AddLinuxMaskedPaths(maskedFileTop)
32+
g.AddLinuxMaskedPaths(maskedDirSub)
33+
g.AddLinuxMaskedPaths(maskedFileSub)
34+
g.AddLinuxMaskedPaths(maskedFileSubSub)
1835
err = util.RuntimeInsideValidate(g, func(path string) error {
19-
testDir := filepath.Join(path, "masked-dir")
36+
testDir := filepath.Join(path, maskedDirSub)
2037
err = os.MkdirAll(testDir, 0777)
2138
if err != nil {
2239
return err
@@ -28,13 +45,130 @@ func main() {
2845
}
2946
defer os.Remove(tmpfile.Name())
3047

31-
testFile := filepath.Join(path, "masked-file")
32-
3348
// runtimetest cannot check the readability of empty files, so
3449
// write something.
50+
testSubSubFile := filepath.Join(path, maskedFileSubSub)
51+
if err := ioutil.WriteFile(testSubSubFile, []byte("secrets"), 0777); err != nil {
52+
return err
53+
}
54+
55+
testSubFile := filepath.Join(path, maskedFileSub)
56+
if err := ioutil.WriteFile(testSubFile, []byte("secrets"), 0777); err != nil {
57+
return err
58+
}
59+
60+
testFile := filepath.Join(path, maskedFile)
3561
return ioutil.WriteFile(testFile, []byte("secrets"), 0777)
3662
})
63+
return err
64+
}
65+
66+
func checkMaskedRelPaths() error {
67+
g, err := util.GetDefaultGenerator()
68+
if err != nil {
69+
return err
70+
}
71+
72+
// Deliberately set a relative path to be masked, and expect an error
73+
maskedRelPath := "masked-relpath"
74+
75+
g.AddLinuxMaskedPaths(maskedRelPath)
76+
err = util.RuntimeInsideValidate(g, func(path string) error {
77+
testFile := filepath.Join(path, maskedRelPath)
78+
if _, err := os.Stat(testFile); err != nil && os.IsNotExist(err) {
79+
return err
80+
}
81+
82+
return nil
83+
})
84+
if err != nil {
85+
return nil
86+
}
87+
return fmt.Errorf("expected: err != nil, actual: err == nil")
88+
}
89+
90+
func checkMaskedSymlinks() error {
91+
g, err := util.GetDefaultGenerator()
3792
if err != nil {
93+
return err
94+
}
95+
96+
// Deliberately create a masked symlink that points an invalid file,
97+
// and expect an error.
98+
maskedSymlink := "/masked-symlink"
99+
100+
g.AddLinuxMaskedPaths(maskedSymlink)
101+
err = util.RuntimeInsideValidate(g, func(path string) error {
102+
testFile := filepath.Join(path, maskedSymlink)
103+
// ln -s .. /masked-symlink ; readlink -f /masked-symlink; ls -L /masked-symlink
104+
if err := os.Symlink("../masked-symlink", testFile); err != nil {
105+
return err
106+
}
107+
rPath, errR := os.Readlink(testFile)
108+
if errR != nil {
109+
return errR
110+
}
111+
_, errS := os.Stat(rPath)
112+
if errS != nil && os.IsNotExist(errS) {
113+
return errS
114+
}
115+
116+
return nil
117+
})
118+
if err != nil {
119+
return nil
120+
}
121+
return fmt.Errorf("expected: err != nil, actual: err == nil")
122+
}
123+
124+
func checkMaskedDeviceNodes(mode uint32) error {
125+
g, err := util.GetDefaultGenerator()
126+
if err != nil {
127+
return err
128+
}
129+
130+
maskedDevice := "/masked-device"
131+
132+
g.AddLinuxMaskedPaths(maskedDevice)
133+
return util.RuntimeInsideValidate(g, func(path string) error {
134+
testFile := filepath.Join(path, maskedDevice)
135+
136+
if err := unix.Mknod(testFile, mode, 0); err != nil {
137+
return err
138+
}
139+
140+
if _, err := os.Stat(testFile); err != nil && os.IsNotExist(err) {
141+
return err
142+
}
143+
144+
return nil
145+
})
146+
}
147+
148+
func main() {
149+
if err := checkMaskedPaths(); err != nil {
150+
util.Fatal(err)
151+
}
152+
153+
if err := checkMaskedRelPaths(); err != nil {
38154
util.Fatal(err)
39155
}
156+
157+
if err := checkMaskedSymlinks(); err != nil {
158+
util.Fatal(err)
159+
}
160+
161+
// test creation of different type of devices, i.e. block device,
162+
// character device, and FIFO.
163+
modes := []uint32{
164+
unix.S_IFBLK | 0666,
165+
unix.S_IFCHR | 0666,
166+
unix.S_IFIFO | 0666,
167+
}
168+
169+
for _, m := range modes {
170+
if err := checkMaskedDeviceNodes(m); err != nil {
171+
util.Fatal(err)
172+
}
173+
}
40174
}

0 commit comments

Comments
 (0)