@@ -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+
6068type 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
15241550func 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 )
0 commit comments