drbd: poison free'd device, resource and connection structs
authorLars Ellenberg <lars.ellenberg@linbit.com>
Wed, 14 May 2014 19:35:21 +0000 (21:35 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 10 Jul 2014 16:35:09 +0000 (18:35 +0200)
Now that we have additional asynchronous kref_get/kref_put
via debugfs, make sure we catch access after free.

Poison struct drbd_device, drbd_connection and drbd_resource
before kfree() with 0xfd, 0xfc, and 0xf2, respectively.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_main.c

index 686c5a59edebc84eb3da455d87c8e5c3fe291d12..92547d16b2c72cf4d194fcc819cedb30d1b57b5d 100644 (file)
@@ -2192,6 +2192,7 @@ void drbd_destroy_device(struct kref *kref)
        blk_cleanup_queue(device->rq_queue);
        kfree(device->rs_plan_s);
        kfree(first_peer_device(device));
+       memset(device, 0xfd, sizeof(*device));
        kfree(device);
 
        for_each_connection(connection, resource)
@@ -2285,6 +2286,7 @@ void drbd_destroy_resource(struct kref *kref)
        idr_destroy(&resource->devices);
        free_cpumask_var(resource->cpu_mask);
        kfree(resource->name);
+       memset(resource, 0xf2, sizeof(*resource));
        kfree(resource);
 }
 
@@ -2665,6 +2667,7 @@ void drbd_destroy_connection(struct kref *kref)
        drbd_free_socket(&connection->data);
        kfree(connection->int_dig_in);
        kfree(connection->int_dig_vv);
+       memset(connection, 0xfc, sizeof(*connection));
        kfree(connection);
        kref_put(&resource->kref, drbd_destroy_resource);
 }
This page took 0.027248 seconds and 5 git commands to generate.