aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/linux
diff options
context:
space:
mode:
Diffstat (limited to 'internal/linux')
-rw-r--r--internal/linux/interface.go1
-rw-r--r--internal/linux/std.go18
2 files changed, 14 insertions, 5 deletions
diff --git a/internal/linux/interface.go b/internal/linux/interface.go
index cf25ecb1..762414c8 100644
--- a/internal/linux/interface.go
+++ b/internal/linux/interface.go
@@ -37,6 +37,7 @@ type System interface {
// Paths returns a populated [Paths] struct.
Paths() Paths
// Uid invokes fsu and returns target uid.
+ // Any errors returned by Uid is already wrapped [fmsg.BaseError].
Uid(aid int) (int, error)
}
diff --git a/internal/linux/std.go b/internal/linux/std.go
index fceba95f..89338f19 100644
--- a/internal/linux/std.go
+++ b/internal/linux/std.go
@@ -2,6 +2,7 @@ package linux
import (
"errors"
+ "fmt"
"io/fs"
"log"
"os"
@@ -56,13 +57,15 @@ func (s *Std) Uid(aid int) (int, error) {
})
})
- s.uidMu.RLock()
- if u, ok := s.uidCopy[aid]; ok {
+ {
+ s.uidMu.RLock()
+ u, ok := s.uidCopy[aid]
s.uidMu.RUnlock()
- return u.uid, u.err
+ if ok {
+ return u.uid, u.err
+ }
}
- s.uidMu.RUnlock()
s.uidMu.Lock()
defer s.uidMu.Unlock()
@@ -91,8 +94,13 @@ func (s *Std) Uid(aid int) (int, error) {
if p, u.err = cmd.Output(); u.err == nil {
u.uid, u.err = strconv.Atoi(string(p))
+ if u.err != nil {
+ u.err = fmsg.WrapErrorSuffix(u.err, "cannot parse uid from fsu:")
+ }
} else if errors.As(u.err, &exitError) && exitError != nil && exitError.ExitCode() == 1 {
- u.err = syscall.EACCES
+ u.err = fmsg.WrapError(syscall.EACCES, "") // fsu prints to stderr in this case
+ } else if os.IsNotExist(u.err) {
+ u.err = fmsg.WrapError(os.ErrNotExist, fmt.Sprintf("the setuid helper is missing: %s", fsu))
}
return u.uid, u.err
}