diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-04-12 13:56:41 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-04-12 13:56:41 +0900 |
| commit | 6309469e933a31a300fbf16d8e77f48dcee402d3 (patch) | |
| tree | 8f8a72ee02b3ca15b104a6e55c9379e20f8d7e8a /internal/app/setuid/errors.go | |
| parent | 0d7c1a9a4356614f035225aeb24e66421879a99b (diff) | |
app/instance: wrap internal implementation
This reduces the scope of the fst package, which was growing questionably large.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/app/setuid/errors.go')
| -rw-r--r-- | internal/app/setuid/errors.go | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/internal/app/setuid/errors.go b/internal/app/setuid/errors.go deleted file mode 100644 index e6c9685c..00000000 --- a/internal/app/setuid/errors.go +++ /dev/null @@ -1,182 +0,0 @@ -package setuid - -import ( - "errors" - "log" - - "git.gensokyo.uk/security/fortify/fst" - "git.gensokyo.uk/security/fortify/internal/fmsg" -) - -func PrintRunStateErr(rs *fst.RunState, runErr error) (code int) { - code = rs.ExitStatus() - - if runErr != nil { - if rs.Time == nil { - fmsg.PrintBaseError(runErr, "cannot start app:") - } else { - var e *fmsg.BaseError - if !fmsg.AsBaseError(runErr, &e) { - log.Println("wait failed:", runErr) - } else { - // Wait only returns either *app.ProcessError or *app.StateStoreError wrapped in a *app.BaseError - var se *StateStoreError - if !errors.As(runErr, &se) { - // does not need special handling - log.Print(e.Message()) - } else { - // inner error are either unwrapped store errors - // or joined errors returned by *appSealTx revert - // wrapped in *app.BaseError - var ej RevertCompoundError - if !errors.As(se.InnerErr, &ej) { - // does not require special handling - log.Print(e.Message()) - } else { - errs := ej.Unwrap() - - // every error here is wrapped in *app.BaseError - for _, ei := range errs { - var eb *fmsg.BaseError - if !errors.As(ei, &eb) { - // unreachable - log.Println("invalid error type returned by revert:", ei) - } else { - // print inner *app.BaseError message - log.Print(eb.Message()) - } - } - } - } - } - } - - if code == 0 { - code = 126 - } - } - - if rs.RevertErr != nil { - var stateStoreError *StateStoreError - if !errors.As(rs.RevertErr, &stateStoreError) || stateStoreError == nil { - fmsg.PrintBaseError(rs.RevertErr, "generic fault during cleanup:") - goto out - } - - if stateStoreError.Err != nil { - if len(stateStoreError.Err) == 2 { - if stateStoreError.Err[0] != nil { - if joinedErrs, ok := stateStoreError.Err[0].(interface{ Unwrap() []error }); !ok { - fmsg.PrintBaseError(stateStoreError.Err[0], "generic fault during revert:") - } else { - for _, err := range joinedErrs.Unwrap() { - if err != nil { - fmsg.PrintBaseError(err, "fault during revert:") - } - } - } - } - if stateStoreError.Err[1] != nil { - log.Printf("cannot close store: %v", stateStoreError.Err[1]) - } - } else { - log.Printf("fault during cleanup: %v", - errors.Join(stateStoreError.Err...)) - } - } - - if stateStoreError.OpErr != nil { - log.Printf("blind revert due to store fault: %v", - stateStoreError.OpErr) - } - - if stateStoreError.DoErr != nil { - fmsg.PrintBaseError(stateStoreError.DoErr, "state store operation unsuccessful:") - } - - if stateStoreError.Inner && stateStoreError.InnerErr != nil { - fmsg.PrintBaseError(stateStoreError.InnerErr, "cannot destroy state entry:") - } - - out: - if code == 0 { - code = 128 - } - } - if rs.WaitErr != nil { - fmsg.Verbosef("wait: %v", rs.WaitErr) - } - return -} - -// StateStoreError is returned for a failed state save -type StateStoreError struct { - // whether inner function was called - Inner bool - // returned by the Save/Destroy method of [state.Cursor] - InnerErr error - // returned by the Do method of [state.Store] - DoErr error - // stores an arbitrary store operation error - OpErr error - // stores arbitrary errors - Err []error -} - -// save saves arbitrary errors in [StateStoreError] once. -func (e *StateStoreError) save(errs ...error) { - if len(errs) == 0 || e.Err != nil { - panic("invalid call to save") - } - e.Err = errs -} - -func (e *StateStoreError) equiv(a ...any) error { - if e.Inner && e.InnerErr == nil && e.DoErr == nil && e.OpErr == nil && errors.Join(e.Err...) == nil { - return nil - } else { - return fmsg.WrapErrorSuffix(e, a...) - } -} - -func (e *StateStoreError) Error() string { - if e.Inner && e.InnerErr != nil { - return e.InnerErr.Error() - } - if e.DoErr != nil { - return e.DoErr.Error() - } - if e.OpErr != nil { - return e.OpErr.Error() - } - if err := errors.Join(e.Err...); err != nil { - return err.Error() - } - - // equiv nullifies e for values where this is reached - panic("unreachable") -} - -func (e *StateStoreError) Unwrap() (errs []error) { - errs = make([]error, 0, 3) - if e.InnerErr != nil { - errs = append(errs, e.InnerErr) - } - if e.DoErr != nil { - errs = append(errs, e.DoErr) - } - if e.OpErr != nil { - errs = append(errs, e.OpErr) - } - if err := errors.Join(e.Err...); err != nil { - errs = append(errs, err) - } - return -} - -// A RevertCompoundError encapsulates errors returned by -// the Revert method of [system.I]. -type RevertCompoundError interface { - Error() string - Unwrap() []error -} |
