livepatch: Handle allocation failure in the sample of shadow variable API
authorPetr Mladek <pmladek@suse.com>
Thu, 16 Jan 2020 15:31:45 +0000 (16:31 +0100)
committerJiri Kosina <jkosina@suse.cz>
Fri, 17 Jan 2020 10:12:06 +0000 (11:12 +0100)
klp_shadow_alloc() is not handled in the sample of shadow variable API.
It is not strictly necessary because livepatch_fix1_dummy_free() is
able to handle the potential failure. But it is an example and it should
use the API a clean way.

Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Joe Lawrence <joe.lawrence@redhat.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
samples/livepatch/livepatch-shadow-fix1.c

index de0363b288a711d0a0ffcb983032b6060c21d27b..918ce17b43fda2d732075a6720f1655fbd22f577 100644 (file)
@@ -66,6 +66,7 @@ static struct dummy *livepatch_fix1_dummy_alloc(void)
 {
        struct dummy *d;
        int *leak;
+       int **shadow_leak;
 
        d = kzalloc(sizeof(*d), GFP_KERNEL);
        if (!d)
@@ -80,18 +81,27 @@ static struct dummy *livepatch_fix1_dummy_alloc(void)
         * pointer to handle resource release.
         */
        leak = kzalloc(sizeof(*leak), GFP_KERNEL);
-       if (!leak) {
-               kfree(d);
-               return NULL;
+       if (!leak)
+               goto err_leak;
+
+       shadow_leak = klp_shadow_alloc(d, SV_LEAK, sizeof(leak), GFP_KERNEL,
+                                      shadow_leak_ctor, &leak);
+       if (!shadow_leak) {
+               pr_err("%s: failed to allocate shadow variable for the leaking pointer: dummy @ %p, leak @ %p\n",
+                      __func__, d, leak);
+               goto err_shadow;
        }
 
-       klp_shadow_alloc(d, SV_LEAK, sizeof(leak), GFP_KERNEL,
-                        shadow_leak_ctor, &leak);
-
        pr_info("%s: dummy @ %p, expires @ %lx\n",
                __func__, d, d->jiffies_expire);
 
        return d;
+
+err_shadow:
+       kfree(leak);
+err_leak:
+       kfree(d);
+       return NULL;
 }
 
 static void livepatch_fix1_dummy_leak_dtor(void *obj, void *shadow_data)