patch "staging: lustre: echo_copy.._lsm() dereferences userland pointers" added to staging-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: lustre: echo_copy.._lsm() dereferences userland pointers
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
9225c0b7b976dd9ceac2b80727a60d8fcb906a62Mon Sep 17 00:00:00 2001
From: Al Viro <[email protected]>
Date: Tue, 1 Dec 2015 19:52:12 +0000
Subject: staging: lustre: echo_copy.._lsm() dereferences userland pointers
directly
missing get_user()
--- drivers/staging/lustre/lustre/obdecho/echo_client.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
drivers/staging/lustre/lustre/obdecho/echo_client.c +11 -9
@@ -1270,6 +1270,7 @@ static int echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob) { struct lov_stripe_md *ulsm = _ulsm; +struct lov_oinfo **p;int nob, i; nob = offsetof(struct lov_stripe_md, lsm_oinfo[lsm->lsm_stripe_count]);
@@ -1279,9 +1280,10 @@ echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)if (copy_to_user (ulsm, lsm,sizeof (*ulsm)))return -EFAULT ; -for (i =0 ; i < lsm->lsm_stripe_count; i++) { -if (copy_to_user (ulsm->lsm_oinfo[i], lsm->lsm_oinfo[i], -sizeof (lsm->lsm_oinfo[0 ]))) +for (i =0 , p = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++, p++) { +struct lov_oinfo __user *up; +if (get_user (up, ulsm->lsm_oinfo + i) || +copy_to_user (up, *p,sizeof (struct lov_oinfo )))return -EFAULT ; }return 0 ;
@@ -1289,9 +1291,10 @@ echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)static int echo_copyin_lsm (struct echo_device *ed,struct lov_stripe_md *lsm, -void *ulsm,int ulsm_nob) +struct lov_stripe_md __user *ulsm,int ulsm_nob) {struct echo_client_obd *ec = ed->ed_ec; +struct lov_oinfo **p;int i;if (ulsm_nob <sizeof (*lsm))
@@ -1306,11 +1309,10 @@ echo_copyin_lsm(struct echo_device *ed, struct lov_stripe_md *lsm, ((__u64)lsm->lsm_stripe_size * lsm->lsm_stripe_count > ~0UL))return -EINVAL ; -for (i =0 ; i < lsm->lsm_stripe_count; i++) { -if (copy_from_user (lsm->lsm_oinfo[i], - ((struct lov_stripe_md *)ulsm)-> \ - lsm_oinfo[i], -sizeof (lsm->lsm_oinfo[0 ]))) +for (i =0 , p = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++, p++) { +struct lov_oinfo __user *up; +if (get_user (up, ulsm->lsm_oinfo + i) || +copy_from_user (*p, up,sizeof (struct lov_oinfo )))return -EFAULT ; }return 0 ;
Signature · 1 line
2.6.2