summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-07-09 09:41:13 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2010-07-19 09:26:26 +0200
commitef0a304388b3d17a7730f04aa58aef5f94fcbf35 (patch)
tree547f375b22da76fcce879587a1b064b9eca01ded
parent8bc83c103fc3ac26ebadbe4fda33f4f72bd6b998 (diff)
downloadkernel-crypto-ef0a304388b3d17a7730f04aa58aef5f94fcbf35.tar.gz
kernel-crypto-ef0a304388b3d17a7730f04aa58aef5f94fcbf35.tar.xz
kernel-crypto-ef0a304388b3d17a7730f04aa58aef5f94fcbf35.zip
Fix copy_{from,to}_user error handling
These functions return a positive number, not an error code, on failure. Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r--cryptodev_main.c68
-rw-r--r--ncr-data.c38
-rw-r--r--ncr-key-wrap.c20
-rw-r--r--ncr-key.c31
-rw-r--r--ncr-sessions.c33
-rw-r--r--ncr.c6
6 files changed, 98 insertions, 98 deletions
diff --git a/cryptodev_main.c b/cryptodev_main.c
index bf1ee3ec703..05beb34cfd4 100644
--- a/cryptodev_main.c
+++ b/cryptodev_main.c
@@ -209,8 +209,8 @@ crypto_create_session(struct fcrypt *fcr, struct session_op *sop)
goto error_cipher;
}
- ret = copy_from_user(keyp, sop->key, sop->keylen);
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(keyp, sop->key, sop->keylen))) {
+ ret = -EFAULT;
goto error_cipher;
}
@@ -233,8 +233,9 @@ crypto_create_session(struct fcrypt *fcr, struct session_op *sop)
goto error_hash;
}
- ret = copy_from_user(keyp, sop->mackey, sop->mackeylen);
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(keyp, sop->mackey,
+ sop->mackeylen))) {
+ ret = -EFAULT;
goto error_hash;
}
@@ -429,9 +430,10 @@ crypto_run(struct fcrypt *fcr, struct crypt_op *cop)
uint8_t iv[EALG_MAX_BLOCK_LEN];
ivsize = min((int)sizeof(iv), ses_ptr->cdata.ivsize);
- ret = copy_from_user(iv, cop->iv, ivsize);
- if (unlikely(ret))
+ if (unlikely(copy_from_user(iv, cop->iv, ivsize))) {
+ ret = -EFAULT;
goto out;
+ }
cryptodev_cipher_set_iv(&ses_ptr->cdata, iv, ivsize);
}
@@ -444,9 +446,10 @@ crypto_run(struct fcrypt *fcr, struct crypt_op *cop)
while(nbytes > 0) {
size_t current_len = nbytes > bufsize ? bufsize : nbytes;
- ret = copy_from_user(data, src, current_len);
- if (unlikely(ret))
+ if (unlikely(copy_from_user(data, src, current_len))) {
+ ret = -EFAULT;
goto out;
+ }
sg_init_one(&sg, data, current_len);
@@ -470,8 +473,10 @@ crypto_run(struct fcrypt *fcr, struct crypt_op *cop)
}
ret = copy_to_user(dst, data, current_len);
- if (unlikely(ret))
+ if (unlikely(ret)) {
+ ret = -EFAULT;
goto out;
+ }
dst += current_len;
}
} else {
@@ -484,8 +489,10 @@ crypto_run(struct fcrypt *fcr, struct crypt_op *cop)
}
ret = copy_to_user(dst, data, current_len);
- if (unlikely(ret))
+ if (unlikely(ret)) {
+ ret = -EFAULT;
goto out;
+ }
dst += current_len;
}
@@ -511,8 +518,10 @@ crypto_run(struct fcrypt *fcr, struct crypt_op *cop)
}
ret = copy_to_user(cop->mac, hash_output, ses_ptr->hdata.digestsize);
- if (unlikely(ret))
+ if (unlikely(ret)) {
+ ret = -EFAULT;
goto out;
+ }
}
#if defined(CRYPTODEV_STATS)
@@ -616,9 +625,9 @@ cryptodev_ioctl(struct inode *inode, struct file *filp,
}
return ret;
case CIOCGSESSION:
- ret = copy_from_user(&sop, (void*)arg, sizeof(sop));
- if (unlikely(ret))
- return ret;
+ if (unlikely(copy_from_user(&sop, (void*)arg,
+ sizeof(sop))))
+ return -EFAULT;
ret = crypto_create_session(fcr, &sop);
if (unlikely(ret))
@@ -636,14 +645,17 @@ cryptodev_ioctl(struct inode *inode, struct file *filp,
ret = crypto_finish_session(fcr, ses);
return ret;
case CIOCCRYPT:
- ret = copy_from_user(&cop, (void*)arg, sizeof(cop));
- if (unlikely(ret))
- return ret;
+ if (unlikely(copy_from_user(&cop, (void*)arg,
+ sizeof(cop))))
+ return -EFAULT;
ret = crypto_run(fcr, &cop);
if (unlikely(ret))
return ret;
- return copy_to_user((void*)arg, &cop, sizeof(cop));
+ if (unlikely(copy_to_user((void*)arg, &cop,
+ sizeof(cop))))
+ return -EFAULT;
+ return 0;
default:
return ncr_ioctl(pcr->ncr, filp, cmd, arg);
@@ -727,11 +739,10 @@ cryptodev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return cryptodev_ioctl(NULL, file, cmd, arg);
case COMPAT_CIOCGSESSION:
- ret = copy_from_user(&compat_sop,
- (void *)arg, sizeof(compat_sop));
+ if (unlikely(copy_from_user(&compat_sop, (void *)arg,
+ sizeof(compat_sop))))
+ return -EFAULT;
compat_to_session_op(&compat_sop, &sop);
- if (unlikely(ret))
- return ret;
ret = crypto_create_session(fcr, &sop);
if (unlikely(ret))
@@ -747,20 +758,21 @@ cryptodev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return ret;
case COMPAT_CIOCCRYPT:
- ret = copy_from_user(&compat_cop,
- (void*)arg, sizeof(compat_cop));
+ if (unlikely(copy_from_user(&compat_cop, (void*)arg,
+ sizeof(compat_cop))))
+ return -EFAULT;
compat_to_crypt_op(&compat_cop, &cop);
- if (unlikely(ret))
- return ret;
ret = crypto_run(fcr, &cop);
if (unlikely(ret))
return ret;
crypt_op_to_compat(&cop, &compat_cop);
- return copy_to_user((void*)arg,
- &compat_cop, sizeof(compat_cop));
+ if (unlikely(copy_to_user((void*)arg, &compat_cop,
+ sizeof(compat_cop))))
+ return -EFAULT;
+ return 0;
default:
return -EINVAL;
diff --git a/ncr-data.c b/ncr-data.c
index 82db6e88e21..8763234f724 100644
--- a/ncr-data.c
+++ b/ncr-data.c
@@ -118,9 +118,9 @@ int ncr_data_init(struct list_sem_st* lst, void __user* arg)
return ret;
}
- ret = copy_from_user( &init, arg, sizeof(init));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&init, arg, sizeof(init)))) {
err();
+ ret = -EFAULT;
goto err_limits;
}
@@ -148,11 +148,11 @@ int ncr_data_init(struct list_sem_st* lst, void __user* arg)
data->max_data_size = init.max_object_size;
if (init.initial_data != NULL) {
- ret = copy_from_user(data->data, init.initial_data, init.initial_data_size);
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(data->data, init.initial_data,
+ init.initial_data_size))) {
err();
_ncr_data_item_put(data);
- return ret;
+ return -EFAULT;
}
data->data_size = init.initial_data_size;
}
@@ -188,12 +188,10 @@ int ncr_data_deinit(struct list_sem_st* lst, void __user* arg)
{
ncr_data_t desc;
struct data_item_st * item, *tmp;
- int ret;
- ret = copy_from_user( &desc, arg, sizeof(desc));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&desc, arg, sizeof(desc)))) {
err();
- return ret;
+ return -EFAULT;
}
down(&lst->sem);
@@ -216,10 +214,9 @@ int ncr_data_get(struct list_sem_st* lst, void __user* arg)
size_t len;
int ret;
- ret = copy_from_user( &get, arg, sizeof(get));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&get, arg, sizeof(get)))) {
err();
- return ret;
+ return -EFAULT;
}
data = ncr_data_item_get( lst, get.desc);
@@ -243,12 +240,14 @@ int ncr_data_get(struct list_sem_st* lst, void __user* arg)
ret = copy_to_user(arg, &get, sizeof(get));
if (unlikely(ret)) {
err();
+ ret = -EFAULT;
}
if (ret == 0 && len > 0) {
ret = copy_to_user(get.data, data->data, len);
if (unlikely(ret)) {
err();
+ ret = -EFAULT;
}
}
@@ -264,10 +263,9 @@ int ncr_data_set(struct list_sem_st* lst, void __user* arg)
struct data_item_st * data;
int ret;
- ret = copy_from_user( &get, arg, sizeof(get));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&get, arg, sizeof(get)))) {
err();
- return ret;
+ return -EFAULT;
}
data = ncr_data_item_get( lst, get.desc);
@@ -286,9 +284,10 @@ int ncr_data_set(struct list_sem_st* lst, void __user* arg)
if (!get.append_flag) {
if (get.data != NULL) {
- ret = copy_from_user(data->data, get.data, get.data_size);
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(data->data, get.data,
+ get.data_size))) {
err();
+ ret = -EFAULT;
goto cleanup;
}
}
@@ -305,9 +304,10 @@ int ncr_data_set(struct list_sem_st* lst, void __user* arg)
goto cleanup;
}
if (get.data != NULL) {
- ret = copy_from_user(&data->data[offset], get.data, get.data_size);
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&data->data[offset],
+ get.data, get.data_size))) {
err();
+ ret = -EFAULT;
goto cleanup;
}
}
diff --git a/ncr-key-wrap.c b/ncr-key-wrap.c
index b43aac26a4b..cec850e5a39 100644
--- a/ncr-key-wrap.c
+++ b/ncr-key-wrap.c
@@ -422,10 +422,9 @@ struct key_item_st* key = NULL;
struct data_item_st * data = NULL;
int ret;
- ret = copy_from_user( &wrap, arg, sizeof(wrap));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&wrap, arg, sizeof(wrap)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_read( &wkey, key_lst, wrap.keytowrap);
@@ -486,10 +485,9 @@ struct key_item_st* key = NULL;
struct data_item_st * data = NULL;
int ret;
- ret = copy_from_user( &wrap, arg, sizeof(wrap));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&wrap, arg, sizeof(wrap)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_write( &wkey, key_lst, wrap.keytowrap);
@@ -547,10 +545,9 @@ int ret;
return ENOKEY;
}
- ret = copy_from_user( &wrap, arg, sizeof(wrap));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&wrap, arg, sizeof(wrap)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_read( &wkey, key_lst, wrap.keytowrap);
@@ -607,10 +604,9 @@ int ret;
return ENOKEY;
}
- ret = copy_from_user( &wrap, arg, sizeof(wrap));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&wrap, arg, sizeof(wrap)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_write( &wkey, key_lst, wrap.keytowrap);
diff --git a/ncr-key.c b/ncr-key.c
index 4c8287e2346..5b812769760 100644
--- a/ncr-key.c
+++ b/ncr-key.c
@@ -208,12 +208,10 @@ int ncr_key_deinit(struct list_sem_st* lst, void __user* arg)
{
ncr_key_t desc;
struct key_item_st * item, *tmp;
- int ret;
- ret = copy_from_user( &desc, arg, sizeof(desc));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&desc, arg, sizeof(desc)))) {
err();
- return ret;
+ return -EFAULT;
}
down(&lst->sem);
@@ -242,10 +240,9 @@ struct data_item_st* ditem = NULL;
uint32_t size;
int ret;
- ret = copy_from_user( &data, arg, sizeof(data));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&data, arg, sizeof(data)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_read( &item, key_lst, data.key);
@@ -321,10 +318,9 @@ struct key_item_st* item = NULL;
struct data_item_st* ditem = NULL;
int ret;
- ret = copy_from_user( &data, arg, sizeof(data));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&data, arg, sizeof(data)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_write( &item, key_lst, data.key);
@@ -421,10 +417,9 @@ struct key_item_st* item = NULL;
int ret;
size_t size;
- ret = copy_from_user( &gen, arg, sizeof(gen));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&gen, arg, sizeof(gen)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_write( &item, lst, gen.desc);
@@ -477,10 +472,9 @@ struct ncr_key_info_st info;
struct key_item_st* item = NULL;
int ret;
- ret = copy_from_user( &info, arg, sizeof(info));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&info, arg, sizeof(info)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_read(&item, lst, info.key);
@@ -505,10 +499,9 @@ struct key_item_st* private = NULL;
struct key_item_st* public = NULL;
int ret;
- ret = copy_from_user( &gen, arg, sizeof(gen));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&gen, arg, sizeof(gen)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = ncr_key_item_get_write( &private, lst, gen.desc);
diff --git a/ncr-sessions.c b/ncr-sessions.c
index b973bdac9cd..59f1aefab40 100644
--- a/ncr-sessions.c
+++ b/ncr-sessions.c
@@ -449,10 +449,9 @@ int ncr_session_init(struct ncr_lists* lists, void __user* arg)
struct ncr_session_st session;
int ret;
- ret = copy_from_user( &session, arg, sizeof(session));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&session, arg, sizeof(session)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = _ncr_session_init(lists, &session);
@@ -618,12 +617,10 @@ fail:
int ncr_session_update(struct ncr_lists* lists, void __user* arg)
{
struct ncr_session_op_st op;
- int ret;
- ret = copy_from_user( &op, arg, sizeof(op));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user( &op, arg, sizeof(op)))) {
err();
- return ret;
+ return -EFAULT;
}
return _ncr_session_update(lists, &op);
@@ -784,10 +781,9 @@ int ncr_session_final(struct ncr_lists* lists, void __user* arg)
struct ncr_session_op_st op;
int ret;
- ret = copy_from_user( &op, arg, sizeof(op));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&op, arg, sizeof(op)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = _ncr_session_final(lists, &op);
@@ -795,8 +791,12 @@ int ncr_session_final(struct ncr_lists* lists, void __user* arg)
err();
return ret;
}
-
- return copy_to_user(arg, &op, sizeof(op));
+
+ if (unlikely(copy_to_user(arg, &op, sizeof(op)))) {
+ err();
+ return -EFAULT;
+ }
+ return 0;
}
int ncr_session_once(struct ncr_lists* lists, void __user* arg)
@@ -804,10 +804,9 @@ int ncr_session_once(struct ncr_lists* lists, void __user* arg)
struct ncr_session_once_op_st kop;
int ret;
- ret = copy_from_user(&kop, arg, sizeof(kop));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&kop, arg, sizeof(kop)))) {
err();
- return ret;
+ return -EFAULT;
}
ret = _ncr_session_init(lists, &kop.init);
@@ -823,6 +822,8 @@ int ncr_session_once(struct ncr_lists* lists, void __user* arg)
return ret;
}
- return copy_to_user(arg, &kop, sizeof(kop));
+ if (unlikely(copy_to_user(arg, &kop, sizeof(kop))))
+ return -EFAULT;
+ return 0;
}
diff --git a/ncr.c b/ncr.c
index b76047659c8..6e7cb44dbbe 100644
--- a/ncr.c
+++ b/ncr.c
@@ -79,17 +79,15 @@ void ncr_master_key_reset(void)
static int ncr_master_key_set(void* __user arg)
{
struct ncr_master_key_st st;
-int ret;
if (current_euid() != 0 && !capable(CAP_SYS_ADMIN)) {
err();
return -EPERM;
}
- ret = copy_from_user(&st, arg, sizeof(st));
- if (unlikely(ret)) {
+ if (unlikely(copy_from_user(&st, arg, sizeof(st)))) {
err();
- return ret;
+ return -EFAULT;
}
if (st.key_size > sizeof(master_key.key.secret.data)) {