Messages in this thread Patch in this message | | | Date | Sat, 19 Sep 2009 01:03:53 +0200 | From | Roel Kluin <> | Subject | [PATCH] random: kmalloc failure ignored in init_std_data() |
| |
Clean up and error out if kmalloc() fails.
Signed-off-by: Roel Kluin <roel.kluin@gmail.com> --- Found with sed: http://kernelnewbies.org/roelkluin
Build tested. Please review
diff --git a/drivers/char/random.c b/drivers/char/random.c index d8a9255..8a68be8 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -939,7 +939,7 @@ EXPORT_SYMBOL(get_random_bytes); * data into the pool to prepare it for use. The pool is not cleared * as that can only decrease the entropy in the pool. */ -static void init_std_data(struct entropy_store *r) +static int init_std_data(struct entropy_store *r) { ktime_t now; unsigned long flags; @@ -952,16 +952,35 @@ static void init_std_data(struct entropy_store *r) mix_pool_bytes(r, &now, sizeof(now)); mix_pool_bytes(r, utsname(), sizeof(*(utsname()))); /* Enable continuous test in fips mode */ - if (fips_enabled) + if (fips_enabled) { r->last_data = kmalloc(EXTRACT_SIZE, GFP_KERNEL); + if (r->last_data == NULL) + return -ENOMEM; + } + return 0; } static int rand_initialize(void) { - init_std_data(&input_pool); - init_std_data(&blocking_pool); - init_std_data(&nonblocking_pool); + int ret; + ret = init_std_data(&input_pool); + if (ret != 0) + return ret; + + ret = init_std_data(&blocking_pool); + if (ret != 0) + goto free_ip_ld; + + ret = init_std_data(&nonblocking_pool); + if (ret != 0) + goto free_bp_ld; + return 0; +free_bp_ld: + kfree(blocking_pool.last_data); +free_ip_ld: + kfree(input_pool.last_data); + return ret; } module_init(rand_initialize); @@ -1160,8 +1179,8 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg) /* Clear the entropy pool counters. */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - rand_initialize(); - return 0; + retval = rand_initialize(); + return retval; default: return -EINVAL; }
| |