From 5689c9734223fb349bba526d620823a803c3b67e Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Wed, 21 Jul 2010 20:02:50 +0200 Subject: Modified NCR-USER API to "simplify" and allow setting of size of data structure without special system call. --- ncr-key.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'ncr-key.c') diff --git a/ncr-key.c b/ncr-key.c index c6ce932..18cb387 100644 --- a/ncr-key.c +++ b/ncr-key.c @@ -241,6 +241,7 @@ uint32_t size; uint32_t data_flags; int ret; uint8_t* tmp = NULL; +size_t max_data_size; if (unlikely(copy_from_user(&data, arg, sizeof(data)))) { err(); @@ -262,9 +263,16 @@ uint8_t* tmp = NULL; data_flags = key_flags_to_data(item->flags); + ret = ncr_data_item_size(ditem, 1); + if (ret < 0) { + err(); + goto fail; + } + max_data_size = ret; + switch (item->type) { case NCR_KEY_TYPE_SECRET: - if (item->key.secret.size > ditem->max_data_size) { + if (item->key.secret.size > max_data_size) { err(); ret = -EINVAL; goto fail; @@ -283,8 +291,8 @@ uint8_t* tmp = NULL; break; case NCR_KEY_TYPE_PUBLIC: case NCR_KEY_TYPE_PRIVATE: - size = ditem->max_data_size; - + size = max_data_size; + tmp = kmalloc(size, GFP_KERNEL); if (tmp == NULL) { err(); @@ -293,8 +301,6 @@ uint8_t* tmp = NULL; } ret = ncr_pk_pack(item, tmp, &size); - ditem->data_size = size; - if (ret < 0) { err(); goto fail; @@ -341,6 +347,7 @@ struct key_item_st* item = NULL; struct data_item_st* ditem = NULL; uint8_t *tmp = NULL; int ret; +size_t data_size; if (unlikely(copy_from_user(&data, arg, sizeof(data)))) { err(); @@ -379,36 +386,43 @@ int ret; if (data.key_id_size > 0) memcpy(item->key_id, data.key_id, data.key_id_size); + ret = ncr_data_item_size(ditem, 0); + if (ret < 0) { + err(); + goto fail; + } + data_size = ret; + switch(item->type) { case NCR_KEY_TYPE_SECRET: - if (ditem->data_size > NCR_CIPHER_MAX_KEY_LEN) { + if (data_size > NCR_CIPHER_MAX_KEY_LEN) { err(); ret = -EINVAL; goto fail; } - ret = ncr_data_item_getd(ditem, item->key.secret.data, ditem->data_size, item->flags); + ret = ncr_data_item_getd(ditem, item->key.secret.data, data_size, item->flags); if (ret < 0) { err(); goto fail; } - item->key.secret.size = ditem->data_size; + item->key.secret.size = data_size; break; case NCR_KEY_TYPE_PRIVATE: case NCR_KEY_TYPE_PUBLIC: - tmp = kmalloc(ditem->data_size, GFP_KERNEL); + tmp = kmalloc(data_size, GFP_KERNEL); if (tmp == NULL) { err(); return -ENOMEM; } - ret = ncr_data_item_getd(ditem, tmp, ditem->data_size, item->flags); + ret = ncr_data_item_getd(ditem, tmp, data_size, item->flags); if (ret < 0) { err(); goto fail; } - ret = ncr_pk_unpack( item, tmp, ditem->data_size); + ret = ncr_pk_unpack( item, tmp, data_size); if (ret < 0) { err(); goto fail; -- cgit