From 2c9c7fee5b42d8f32be9ff55ad92345ae62c0af7 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Tue, 18 Feb 2025 17:36:58 +0900 Subject: linux: wrap fsu lookup error Signed-off-by: Ophestra --- internal/linux/interface.go | 1 + internal/linux/std.go | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'internal/linux') 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 } -- cgit v1.3.1