summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cryptodev_main.c3
-rw-r--r--ncr-data.c9
-rw-r--r--ncr-limits.c21
-rw-r--r--ncr.c3
-rw-r--r--ncr_int.h1
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);