From d33e6b14fe5b82f9b10af4b7faa3f169ffcdda3a Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 1 Oct 2024 15:10:27 +0200 Subject: [PATCH] rbd: validate IOContext before getting the list of trashed images `ensureImageCleanup()` can cause a panic when an image was deleted, but the journal still contained a reference. By opening the IOContext before using, an error may be returned instead of a panic when using a `nil` or freed IOContext. Signed-off-by: Niels de Vos --- internal/rbd/controllerserver.go | 11 +++-------- internal/rbd/rbd_util.go | 5 +++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index f0ac0a479..1745dbc37 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -881,9 +881,9 @@ func (cs *ControllerServer) checkErrAndUndoReserve( } if errors.Is(err, ErrImageNotFound) { - err = rbdVol.ensureImageCleanup(ctx) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) + notFoundErr := rbdVol.ensureImageCleanup(ctx) + if notFoundErr != nil { + return nil, status.Errorf(codes.Internal, "failed to cleanup image %q: %v", rbdVol, notFoundErr) } } else { // All errors other than ErrImageNotFound should return an error back to the caller @@ -1538,11 +1538,6 @@ func cleanUpImageAndSnapReservation(ctx context.Context, rbdSnap *rbdSnapshot, c } defer rbdVol.Destroy(ctx) - err = rbdVol.openIoctx() - if err != nil { - return status.Error(codes.Internal, err.Error()) - } - // cleanup the image from trash if the error is image not found. err = rbdVol.ensureImageCleanup(ctx) if err != nil { diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 3b07d235d..3b72b7c4c 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -621,6 +621,11 @@ func isCephMgrSupported(ctx context.Context, clusterID string, err error) bool { // ensureImageCleanup finds image in trash and if found removes it // from trash. func (ri *rbdImage) ensureImageCleanup(ctx context.Context) error { + err := ri.openIoctx() + if err != nil { + return err + } + trashInfoList, err := librbd.GetTrashList(ri.ioctx) if err != nil { log.ErrorLog(ctx, "failed to list images in trash: %v", err)