* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
RETURN(rc);
}
+static char *
+ll_getname(const char __user *filename)
+{
+ int ret = 0, len;
+ char *tmp = __getname();
+
+ if (!tmp)
+ return ERR_PTR(-ENOMEM);
+
+ len = strncpy_from_user(tmp, filename, PATH_MAX);
+ if (len == 0)
+ ret = -ENOENT;
+ else if (len > PATH_MAX)
+ ret = -ENAMETOOLONG;
+
+ if (ret) {
+ __putname(tmp);
+ tmp = ERR_PTR(ret);
+ }
+ return tmp;
+}
+
+#define ll_putname(filename) __putname(filename)
+
static long ll_dir_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct inode *inode = file->f_dentry->d_inode;
if (!(exp_connect_flags(sbi->ll_md_exp) & OBD_CONNECT_LVB_TYPE))
return -ENOTSUPP;
- filename = getname((const char *)arg);
+ filename = ll_getname((const char *)arg);
if (IS_ERR(filename))
RETURN(PTR_ERR(filename));
rc = ll_rmdir_entry(inode, filename, namelen);
out_rmdir:
if (filename)
- putname(filename);
+ ll_putname(filename);
RETURN(rc);
}
case LL_IOC_LOV_SWAP_LAYOUTS:
if (cmd == IOC_MDC_GETFILEINFO ||
cmd == IOC_MDC_GETFILESTRIPE) {
- filename = getname((const char *)arg);
+ filename = ll_getname((const char *)arg);
if (IS_ERR(filename))
RETURN(PTR_ERR(filename));
out_req:
ptlrpc_req_finished(request);
if (filename)
- putname(filename);
+ ll_putname(filename);
return rc;
}
case IOC_LOV_GETINFO: {
if (rc)
RETURN(rc);
- OBD_ALLOC_LARGE(lmm, lmmsize);
- if (cfs_copy_from_user(lmm, lum, lmmsize))
- GOTO(free_lmm, rc = -EFAULT);
+ OBD_ALLOC_LARGE(lmm, lmmsize);
+ if (lmm == NULL)
+ RETURN(-ENOMEM);
+
+ if (cfs_copy_from_user(lmm, lum, lmmsize))
+ GOTO(free_lmm, rc = -EFAULT);
switch (lmm->lmm_magic) {
case LOV_USER_MAGIC_V1: