diff options
author | Jerome Marchand <jmarchan@redhat.com> | 2011-09-06 15:02:12 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-06 16:56:16 -0700 |
commit | 5a18c53147205797da3dbc5a7c2678d16709d2dc (patch) | |
tree | f0a801f1e99b8d3bfdb6c1cf2f3be5f6345f8778 /drivers/staging/zram | |
parent | 0900beae178a84e653d9088979cf3014babc097e (diff) | |
download | linux-stable-5a18c53147205797da3dbc5a7c2678d16709d2dc.tar.gz linux-stable-5a18c53147205797da3dbc5a7c2678d16709d2dc.tar.bz2 linux-stable-5a18c53147205797da3dbc5a7c2678d16709d2dc.zip |
staging: zram: prevent accessing an unallocated table when init fails early
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>
Diffstat (limited to 'drivers/staging/zram')
-rw-r--r-- | drivers/staging/zram/zram_drv.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 6fb2be31b3f8..dbb436863e7f 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c @@ -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); |