From 638dc9128fd89f70ddab8d6f342ca5a2e5131be8 Mon Sep 17 00:00:00 2001 From: Dmitriy Matrenichev Date: Tue, 28 Feb 2023 17:26:00 +0300 Subject: [PATCH] fix: fix "defer" leak in ResetUserDisks Also, print error if we failed to close the device. Signed-off-by: Dmitriy Matrenichev --- .../v1alpha1/v1alpha1_sequencer_tasks.go | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go index 4ef087384..b46089e01 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/v1alpha1_sequencer_tasks.go @@ -1634,27 +1634,36 @@ func ResetSystemDisk(seq runtime.Sequence, data interface{}) (runtime.TaskExecut } // ResetUserDisks represents the task to reset the user disks. -func ResetUserDisks(seq runtime.Sequence, data interface{}) (runtime.TaskExecutionFunc, string) { +func ResetUserDisks(_ runtime.Sequence, data any) (runtime.TaskExecutionFunc, string) { return func(ctx context.Context, logger *log.Logger, r runtime.Runtime) (err error) { in, ok := data.(runtime.ResetOptions) if !ok { return fmt.Errorf("unexpected runtime data") } - for _, deviceName := range in.GetUserDisksToWipe() { - var dev *blockdevice.BlockDevice - - dev, err = blockdevice.Open(deviceName) + wipeDevice := func(deviceName string) error { + dev, err := blockdevice.Open(deviceName) if err != nil { return err } - defer dev.Close() //nolint:errcheck + defer func() { + if closeErr := dev.Close(); closeErr != nil { + logger.Printf("failed to close device %s: %s", deviceName, closeErr) + } + }() logger.Printf("wiping user disk %s", deviceName) - err = dev.FastWipe() - if err != nil { + if err = dev.FastWipe(); err != nil { + return err + } + + return nil + } + + for _, deviceName := range in.GetUserDisksToWipe() { + if err := wipeDevice(deviceName); err != nil { return err } }