diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-05-31 16:35:28 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-06-17 20:47:38 +0200 |
commit | b4c1ecb3c841e0d7f7453a93c30a5619b7f3ce4c (patch) | |
tree | b918291448e7842ffa9c06ee2cc74ac8b02525ad | |
parent | 1b3ea65db78ef3dcc8200812117171531c62fe8b (diff) | |
download | cryptodev-linux-b4c1ecb3c841e0d7f7453a93c30a5619b7f3ce4c.tar.gz cryptodev-linux-b4c1ecb3c841e0d7f7453a93c30a5619b7f3ce4c.tar.xz cryptodev-linux-b4c1ecb3c841e0d7f7453a93c30a5619b7f3ce4c.zip |
Added deinitialization of limits on module unloading. Better cleanup of unused data.
-rw-r--r-- | cryptodev_main.c | 3 | ||||
-rw-r--r-- | ncr-data.c | 9 | ||||
-rw-r--r-- | ncr-limits.c | 21 | ||||
-rw-r--r-- | ncr.c | 3 | ||||
-rw-r--r-- | 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); } @@ -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; @@ -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); } } @@ -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); |