diff options
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/lustre/lustre/llite/file.c | 34 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/llite_internal.h | 2 |
2 files changed, 17 insertions, 19 deletions
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c index 084fb9206fd5..d3874e1afba8 100644 --- a/drivers/staging/lustre/lustre/llite/file.c +++ b/drivers/staging/lustre/lustre/llite/file.c @@ -1702,37 +1702,35 @@ out: return rc; } -int ll_fid2path(struct inode *inode, void *arg) +int ll_fid2path(struct inode *inode, void __user *arg) { - struct obd_export *exp = ll_i2mdexp(inode); - struct getinfo_fid2path *gfout, *gfin; - int outsize, rc; + struct obd_export *exp = ll_i2mdexp(inode); + const struct getinfo_fid2path __user *gfin = arg; + struct getinfo_fid2path *gfout; + u32 pathlen; + size_t outsize; + int rc; if (!capable(CFS_CAP_DAC_READ_SEARCH) && !(ll_i2sbi(inode)->ll_flags & LL_SBI_USER_FID2PATH)) return -EPERM; - /* Need to get the buflen */ - OBD_ALLOC_PTR(gfin); - if (gfin == NULL) - return -ENOMEM; - if (copy_from_user(gfin, arg, sizeof(*gfin))) { - OBD_FREE_PTR(gfin); + /* Only need to get the buflen */ + if (get_user(pathlen, &gfin->gf_pathlen)) return -EFAULT; - } - outsize = sizeof(*gfout) + gfin->gf_pathlen; + outsize = sizeof(*gfout) + pathlen; + OBD_ALLOC(gfout, outsize); - if (gfout == NULL) { - OBD_FREE_PTR(gfin); + if (gfout == NULL) return -ENOMEM; - } - memcpy(gfout, gfin, sizeof(*gfout)); - OBD_FREE_PTR(gfin); + + if (copy_from_user(gfout, arg, sizeof(*gfout))) + GOTO(gf_free, rc = -EFAULT); /* Call mdc_iocontrol */ rc = obd_iocontrol(OBD_IOC_FID2PATH, exp, outsize, gfout, NULL); - if (rc) + if (rc != 0) GOTO(gf_free, rc); if (copy_to_user(arg, gfout, outsize)) diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index 684405e26b58..b42d87971f5e 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h @@ -775,7 +775,7 @@ int ll_dir_getstripe(struct inode *inode, struct lov_mds_md **lmmp, int *lmm_size, struct ptlrpc_request **request); int ll_fsync(struct file *file, loff_t start, loff_t end, int data); int ll_merge_lvb(const struct lu_env *env, struct inode *inode); -int ll_fid2path(struct inode *inode, void *arg); +int ll_fid2path(struct inode *inode, void __user *arg); int ll_data_version(struct inode *inode, __u64 *data_version, int extent_lock); int ll_hsm_release(struct inode *inode); |