diff options
-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); |