x86/mce/amd: Do proper cleanup on error paths
authorThomas Gleixner <tglx@linutronix.de>
Fri, 14 Feb 2020 17:32:43 +0000 (18:32 +0100)
committerBorislav Petkov <bp@suse.de>
Tue, 14 Apr 2020 13:31:17 +0000 (15:31 +0200)
Drop kobject reference counts properly on error in the banks and blocks
allocation functions.

 [ bp: Write commit message. ]

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20200403161943.1458-2-bp@alien8.de
arch/x86/kernel/cpu/mce/amd.c

index 52de616..477cf77 100644 (file)
@@ -1267,13 +1267,12 @@ recurse:
        if (b)
                kobject_uevent(&b->kobj, KOBJ_ADD);
 
-       return err;
+       return 0;
 
 out_free:
        if (b) {
-               kobject_put(&b->kobj);
                list_del(&b->miscj);
-               kfree(b);
+               kobject_put(&b->kobj);
        }
        return err;
 }
@@ -1339,6 +1338,7 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank)
                goto out;
        }
 
+       /* Associate the bank with the per-CPU MCE device */
        b->kobj = kobject_create_and_add(name, &dev->kobj);
        if (!b->kobj) {
                err = -EINVAL;
@@ -1357,16 +1357,17 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank)
 
        err = allocate_threshold_blocks(cpu, b, bank, 0, msr_ops.misc(bank));
        if (err)
-               goto out_free;
+               goto out_kobj;
 
        per_cpu(threshold_banks, cpu)[bank] = b;
 
        return 0;
 
- out_free:
+out_kobj:
+       kobject_put(b->kobj);
+out_free:
        kfree(b);
-
- out:
+out:
        return err;
 }