From c58f1286e62cd98fc31526b54d7261fa024942cb Mon Sep 17 00:00:00 2001 From: Justin Chadwell Date: Thu, 18 Aug 2022 12:16:24 +0100 Subject: [PATCH] solver: forward nil return value from sharedOp.Exec Exec could sometimes return nil, which would then result in a segmentation fault, as the code attempts to access a field in the nil result to return. This patch introduces a sanity check before accessing any parts of the field. Signed-off-by: Justin Chadwell --- solver/jobs.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/solver/jobs.go b/solver/jobs.go index 38c42b533185..c7fb1c8fa9b5 100644 --- a/solver/jobs.go +++ b/solver/jobs.go @@ -817,8 +817,11 @@ func (s *sharedOp) Exec(ctx context.Context, inputs []Result) (outputs []Result, } flightControlKey := "exec" res, err := s.g.Do(ctx, flightControlKey, func(ctx context.Context) (ret interface{}, retErr error) { - if s.execRes != nil || s.execErr != nil { - return s.execRes, s.execErr + if s.execErr != nil { + return nil, s.execErr + } + if s.execRes != nil { + return s.execRes, nil } release, err := op.Acquire(ctx) if err != nil { @@ -866,9 +869,12 @@ func (s *sharedOp) Exec(ctx context.Context, inputs []Result) (outputs []Result, } s.execErr = err } - return s.execRes, err + if s.execRes == nil || err != nil { + return nil, err + } + return s.execRes, nil }) - if err != nil { + if res == nil || err != nil { return nil, nil, err } r := res.(*execRes)