Skip to content

Commit e706fcd

Browse files
committed
address feedback on getseuserbyname
Signed-off-by: Andrew LeFevre <[email protected]>
1 parent 4087223 commit e706fcd

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

go-selinux/selinux_linux.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,28 +1310,27 @@ func getSeUserFromReader(username string, gids []string, r io.Reader, lookupGrou
13101310
lineNum++
13111311

13121312
// remove any trailing comments, then extra whitespace
1313-
parts := strings.SplitN(line, "#", 2)
1314-
line = strings.TrimSpace(parts[0])
1313+
line, _, _ = strings.Cut(line, "#")
1314+
line = strings.TrimSpace(line)
13151315
if line == "" {
13161316
continue
13171317
}
13181318

1319-
parts = strings.SplitN(line, ":", 3)
1320-
if len(parts) < 2 {
1319+
userField, rest, ok := strings.Cut(line, ":")
1320+
if !ok {
13211321
return "", "", fmt.Errorf("line %d: malformed line", lineNum)
13221322
}
1323-
userField := parts[0]
13241323
if userField == "" {
13251324
return "", "", fmt.Errorf("line %d: user_id or group_id is empty", lineNum)
13261325
}
1327-
seUserField := parts[1]
1326+
seUserField, rest, ok := strings.Cut(rest, ":")
13281327
if seUserField == "" {
13291328
return "", "", fmt.Errorf("line %d: seuser_id is empty", lineNum)
13301329
}
13311330
var levelField string
13321331
// level is optional
1333-
if len(parts) > 2 {
1334-
levelField = parts[2]
1332+
if ok {
1333+
levelField = rest
13351334
}
13361335

13371336
// we found a match, return it
@@ -1368,7 +1367,7 @@ func getSeUserFromReader(username string, gids []string, r io.Reader, lookupGrou
13681367

13691368
// getSeUserByName returns an SELinux user and MLS level that is
13701369
// mapped to a given Linux user.
1371-
func getSeUserByName(username string) (seUser string, level string, err error) {
1370+
func getSeUserByName(username string) (string, string, error) {
13721371
seUsersConf := filepath.Join(policyRoot(), "seusers")
13731372
confFile, err := os.Open(seUsersConf)
13741373
if err != nil {
@@ -1378,15 +1377,15 @@ func getSeUserByName(username string) (seUser string, level string, err error) {
13781377

13791378
usr, err := user.Lookup(username)
13801379
if err != nil {
1381-
return "", "", fmt.Errorf("failed to lookup user %q", username)
1380+
return "", "", err
13821381
}
13831382
gids, err := usr.GroupIds()
13841383
if err != nil {
1385-
return "", "", fmt.Errorf("failed to find user %q's groups", username)
1384+
return "", "", err
13861385
}
13871386
gids = append([]string{usr.Gid}, gids...)
13881387

1389-
seUser, level, err = getSeUserFromReader(username, gids, confFile, user.LookupGroup)
1388+
seUser, level, err := getSeUserFromReader(username, gids, confFile, user.LookupGroup)
13901389
if err != nil {
13911390
return "", "", fmt.Errorf("failed to parse seusers file: %w", err)
13921391
}

go-selinux/selinux_linux_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,27 @@ user::s0
691691
bob:staff_u:s0-s15:c0.c255`,
692692
expectedErr: "line 3: seuser_id is empty",
693693
},
694+
{
695+
name: "one entry match with whitespace",
696+
username: "bob",
697+
seUserBuf: " bob:staff_u:s0 ",
698+
seUser: "staff_u",
699+
level: "s0",
700+
},
701+
{
702+
name: "one entry match with trailing comment",
703+
username: "bob",
704+
seUserBuf: "bob:staff_u:s0#comment",
705+
seUser: "staff_u",
706+
level: "s0",
707+
},
708+
{
709+
name: "one entry match with whitespace and trailing comment",
710+
username: "bob",
711+
seUserBuf: " bob:staff_u:s0 #comment ",
712+
seUser: "staff_u",
713+
level: "s0",
714+
},
694715
}
695716

696717
for _, tt := range tests {

0 commit comments

Comments
 (0)