From b4c1ecb3c841e0d7f7453a93c30a5619b7f3ce4c Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Mon, 31 May 2010 16:35:28 +0200 Subject: Added deinitialization of limits on module unloading. Better cleanup of unused data. --- cryptodev_main.c | 3 +++ ncr-data.c | 9 +++++++-- ncr-limits.c | 21 +++++++++++++++++++++ ncr.c | 3 --- ncr_int.h | 1 + 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/cryptodev_main.c b/cryptodev_main.c index da7ef2b..460e3d3 100644 --- a/cryptodev_main.c +++ b/cryptodev_main.c @@ -728,6 +728,8 @@ cryptodev_register(void) { int rc; + ncr_limits_init(); + rc = misc_register (&cryptodev); if (unlikely(rc)) { printk(KERN_ERR PFX "registeration of /dev/crypto failed\n"); @@ -740,6 +742,7 @@ cryptodev_register(void) static void cryptodev_deregister(void) { + ncr_limits_deinit(); misc_deregister(&cryptodev); } diff --git a/ncr-data.c b/ncr-data.c index 2c4c3ac..226c6e4 100644 --- a/ncr-data.c +++ b/ncr-data.c @@ -182,6 +182,7 @@ int ncr_data_get(struct list_sem_st* lst, void __user* arg) struct ncr_data_st get; struct data_item * data; size_t len; + int ret; copy_from_user( &get, arg, sizeof(get)); @@ -194,7 +195,8 @@ int ncr_data_get(struct list_sem_st* lst, void __user* arg) if (!(data->flags & NCR_DATA_FLAG_EXPORTABLE)) { err(); - return -EPERM; + ret = -EPERM; + goto cleanup; } len = min(get.data_size, data->data_size); @@ -206,9 +208,12 @@ int ncr_data_get(struct list_sem_st* lst, void __user* arg) if (len > 0) copy_to_user(get.data, data->data, len); + ret = 0; + +cleanup: _ncr_data_item_put( data); - return 0; + return ret; } int ncr_data_set(struct list_sem_st* lst, void __user* arg) diff --git a/ncr-limits.c b/ncr-limits.c index df6be74..63b4d8b 100644 --- a/ncr-limits.c +++ b/ncr-limits.c @@ -72,6 +72,27 @@ void ncr_limits_init(void) INIT_LIST_HEAD(&limits.processes.list); } +void ncr_limits_deinit(void) +{ +struct limit_process_item_st* pitem, *ptmp; +struct limit_user_item_st* uitem, *utmp; + + down(&limits.users.sem); + list_for_each_entry_safe(uitem, utmp, &limits.users.list, list) { + list_del(&uitem->list); + kfree(uitem); + } + up(&limits.users.sem); + + down(&limits.processes.sem); + list_for_each_entry_safe(pitem, ptmp, &limits.processes.list, list) { + list_del(&pitem->list); + kfree(pitem); + } + up(&limits.processes.sem); + +} + int ncr_limits_add_and_check(struct file *filp, limits_type_t type) { struct limit_process_item_st* pitem; diff --git a/ncr.c b/ncr.c index e0748f3..c9cc664 100644 --- a/ncr.c +++ b/ncr.c @@ -50,8 +50,6 @@ void* ncr_init_lists(void) init_MUTEX(&lst->key.sem); INIT_LIST_HEAD(&lst->key.list); - ncr_limits_init(); - return lst; } @@ -60,7 +58,6 @@ void ncr_deinit_lists(struct ncr_lists *lst) if(lst) { ncr_data_list_deinit(&lst->data); ncr_key_list_deinit(&lst->key); - kfree(lst); } } diff --git a/ncr_int.h b/ncr_int.h index 1b49540..5493320 100644 --- a/ncr_int.h +++ b/ncr_int.h @@ -98,6 +98,7 @@ typedef enum { void ncr_limits_remove(struct file *filp, limits_type_t type); int ncr_limits_add_and_check(struct file *filp, limits_type_t type); void ncr_limits_init(void); +void ncr_limits_deinit(void); ncr_key_type_t ncr_algorithm_to_key_type(ncr_algorithm_t algo); -- cgit