staging: zram: prevent accessing an unallocated table when init fails early
authorJerome Marchand <jmarchan@redhat.com>
Tue, 6 Sep 2011 13:02:12 +0000 (15:02 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 6 Sep 2011 23:56:16 +0000 (16:56 -0700)
When the allocation of zram->table fails, we set zram->disksize to zero
to prevent accessing the unallocated table entries during cleanup.
However, we currently don't take this precaution when the initialization
fails earlier.

Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/zram/zram_drv.c

index 6fb2be31b3f8ca14126ddf719a2a5004a684cccc..dbb436863e7f6e1f9183791211918b2563f1c6ca 100644 (file)
@@ -651,24 +651,22 @@ int zram_init_device(struct zram *zram)
        if (!zram->compress_workmem) {
                pr_err("Error allocating compressor working memory!\n");
                ret = -ENOMEM;
-               goto fail;
+               goto fail_no_table;
        }
 
        zram->compress_buffer = (void *)__get_free_pages(__GFP_ZERO, 1);
        if (!zram->compress_buffer) {
                pr_err("Error allocating compressor buffer space\n");
                ret = -ENOMEM;
-               goto fail;
+               goto fail_no_table;
        }
 
        num_pages = zram->disksize >> PAGE_SHIFT;
        zram->table = vzalloc(num_pages * sizeof(*zram->table));
        if (!zram->table) {
                pr_err("Error allocating zram address table\n");
-               /* To prevent accessing table entries during cleanup */
-               zram->disksize = 0;
                ret = -ENOMEM;
-               goto fail;
+               goto fail_no_table;
        }
 
        set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
@@ -689,6 +687,9 @@ int zram_init_device(struct zram *zram)
        pr_debug("Initialization done!\n");
        return 0;
 
+fail_no_table:
+       /* To prevent accessing table entries during cleanup */
+       zram->disksize = 0;
 fail:
        __zram_reset_device(zram);
        up_write(&zram->init_lock);