diff options
author | Miloslav Trmač <mitr@redhat.com> | 2010-07-09 09:41:13 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-19 09:26:26 +0200 |
commit | ef0a304388b3d17a7730f04aa58aef5f94fcbf35 (patch) | |
tree | 547f375b22da76fcce879587a1b064b9eca01ded | |
parent | 8bc83c103fc3ac26ebadbe4fda33f4f72bd6b998 (diff) | |
download | kernel-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.c | 68 | ||||
-rw-r--r-- | ncr-data.c | 38 | ||||
-rw-r--r-- | ncr-key-wrap.c | 20 | ||||
-rw-r--r-- | ncr-key.c | 31 | ||||
-rw-r--r-- | ncr-sessions.c | 33 | ||||
-rw-r--r-- | ncr.c | 6 |
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; } @@ -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)) { |