Skip to content

Commit 32b9945

Browse files
committed
open context files lazily
Signed-off-by: Andrew LeFevre <[email protected]>
1 parent e706fcd commit 32b9945

File tree

2 files changed

+62
-42
lines changed

2 files changed

+62
-42
lines changed

go-selinux/selinux_linux.go

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,19 @@ type mlsRange struct {
5757
high *level
5858
}
5959

60+
type openReaderCloser func() (io.ReadCloser, error)
61+
62+
func createOpener(path string) openReaderCloser {
63+
return func() (io.ReadCloser, error) {
64+
return os.Open(path)
65+
}
66+
}
67+
6068
type defaultSECtx struct {
61-
userRdr io.Reader
69+
openUserRdr openReaderCloser
6270
verifier func(string) error
63-
defaultRdr io.Reader
64-
failsafeRdr io.Reader
71+
openDefaultRdr openReaderCloser
72+
openFailsafeRdr openReaderCloser
6573
user, level, scon string
6674
}
6775

@@ -1491,7 +1499,13 @@ func getDefaultContextFromReaders(c *defaultSECtx) (string, error) {
14911499
context["user"] = c.user
14921500
context["level"] = c.level
14931501

1494-
conn, err := findUserInContext(context, c.userRdr, c.verifier)
1502+
userRdr, err := c.openUserRdr()
1503+
if err != nil {
1504+
return "", fmt.Errorf("failed to open user context file: %w", err)
1505+
}
1506+
defer userRdr.Close()
1507+
1508+
conn, err := findUserInContext(context, userRdr, c.verifier)
14951509
if err != nil {
14961510
return "", fmt.Errorf("failed to read %q's user context file: %w", c.user, err)
14971511
}
@@ -1500,7 +1514,13 @@ func getDefaultContextFromReaders(c *defaultSECtx) (string, error) {
15001514
return conn, nil
15011515
}
15021516

1503-
conn, err = findUserInContext(context, c.defaultRdr, c.verifier)
1517+
defaultRdr, err := c.openDefaultRdr()
1518+
if err != nil {
1519+
return "", fmt.Errorf("failed to open default context file: %w", err)
1520+
}
1521+
defer defaultRdr.Close()
1522+
1523+
conn, err = findUserInContext(context, defaultRdr, c.verifier)
15041524
if err != nil {
15051525
return "", fmt.Errorf("failed to read default user context file: %w", err)
15061526
}
@@ -1509,7 +1529,13 @@ func getDefaultContextFromReaders(c *defaultSECtx) (string, error) {
15091529
return conn, nil
15101530
}
15111531

1512-
conn, err = getFailsafeContext(context, c.failsafeRdr, c.verifier)
1532+
failsafeRdr, err := c.openFailsafeRdr()
1533+
if err != nil {
1534+
return "", fmt.Errorf("failed to open failsafe context file: %w", err)
1535+
}
1536+
defer failsafeRdr.Close()
1537+
1538+
conn, err = getFailsafeContext(context, failsafeRdr, c.verifier)
15131539
if err != nil {
15141540
return "", fmt.Errorf("failed to read failsafe_context: %w", err)
15151541
}
@@ -1523,34 +1549,17 @@ func getDefaultContextFromReaders(c *defaultSECtx) (string, error) {
15231549

15241550
func getDefaultContextWithLevel(user, level, scon string) (string, error) {
15251551
userPath := filepath.Join(policyRoot(), selinuxUsersDir, user)
1526-
fu, err := os.Open(userPath)
1527-
if err != nil {
1528-
return "", fmt.Errorf("failed to open %q's user context file: %w", user, err)
1529-
}
1530-
defer fu.Close()
1531-
15321552
defaultPath := filepath.Join(policyRoot(), defaultContexts)
1533-
fd, err := os.Open(defaultPath)
1534-
if err != nil {
1535-
return "", fmt.Errorf("failed to open default user context file: %w", err)
1536-
}
1537-
defer fd.Close()
1538-
15391553
failsafePath := filepath.Join(policyRoot(), failsafeContext)
1540-
fs, err := os.Open(failsafePath)
1541-
if err != nil {
1542-
return "", fmt.Errorf("failed to open failsafe user context file: %w", err)
1543-
}
1544-
defer fs.Close()
15451554

15461555
c := defaultSECtx{
1547-
user: user,
1548-
level: level,
1549-
scon: scon,
1550-
userRdr: fu,
1551-
defaultRdr: fd,
1552-
failsafeRdr: fs,
1553-
verifier: securityCheckContext,
1556+
user: user,
1557+
level: level,
1558+
scon: scon,
1559+
openUserRdr: createOpener(userPath),
1560+
openDefaultRdr: createOpener(defaultPath),
1561+
openFailsafeRdr: createOpener(failsafePath),
1562+
verifier: securityCheckContext,
15541563
}
15551564

15561565
return getDefaultContextFromReaders(&c)

go-selinux/selinux_linux_test.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"bytes"
66
"errors"
77
"fmt"
8+
"io"
89
"os"
910
"os/user"
1011
"path/filepath"
@@ -782,12 +783,16 @@ fake_r:fake_t:s0 baz_r:baz_t:s0 sysadm_r:sysadm_t:s0
782783
for _, tt := range tests {
783784
t.Run(tt.name, func(t *testing.T) {
784785
c := defaultSECtx{
785-
user: "bob",
786-
level: "SystemLow-SystemHigh",
787-
scon: "system_u:staff_r:staff_t:s0",
788-
userRdr: bytes.NewBufferString(tt.userBuff),
789-
defaultRdr: bytes.NewBufferString(tt.defaultBuff),
790-
verifier: verifier,
786+
user: "bob",
787+
level: "SystemLow-SystemHigh",
788+
scon: "system_u:staff_r:staff_t:s0",
789+
openUserRdr: func() (io.ReadCloser, error) {
790+
return io.NopCloser(bytes.NewBufferString(tt.userBuff)), nil
791+
},
792+
openDefaultRdr: func() (io.ReadCloser, error) {
793+
return io.NopCloser(bytes.NewBufferString(tt.defaultBuff)), nil
794+
},
795+
verifier: verifier,
791796
}
792797

793798
got, err := getDefaultContextFromReaders(&c)
@@ -809,12 +814,18 @@ fake_r:fake_t:s0 baz_r:baz_t:s0 sysadm_r:sysadm_t:s0
809814
dne_r:dne_t:s0 baz_r:baz_t:s0 sysadm_r:sysadm_t:s0
810815
`
811816
c := defaultSECtx{
812-
user: "bob",
813-
level: "SystemLow-SystemHigh",
814-
scon: "system_u:staff_r:staff_t:s0",
815-
userRdr: bytes.NewBufferString(badUserBuff),
816-
defaultRdr: bytes.NewBufferString(badDefaultBuff),
817-
failsafeRdr: bytes.NewBufferString(goodFailsafeBuff),
817+
user: "bob",
818+
level: "SystemLow-SystemHigh",
819+
scon: "system_u:staff_r:staff_t:s0",
820+
openUserRdr: func() (io.ReadCloser, error) {
821+
return io.NopCloser(bytes.NewBufferString(badUserBuff)), nil
822+
},
823+
openDefaultRdr: func() (io.ReadCloser, error) {
824+
return io.NopCloser(bytes.NewBufferString(badDefaultBuff)), nil
825+
},
826+
openFailsafeRdr: func() (io.ReadCloser, error) {
827+
return io.NopCloser(bytes.NewBufferString(goodFailsafeBuff)), nil
828+
},
818829
verifier: func(s string) error {
819830
return nil
820831
},

0 commit comments

Comments
 (0)