Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-5935 lnet: Fixes to make lnetctl function as expected.
[fs/lustre-release.git]
/
libcfs
/
libcfs
/
linux
/
linux-module.c
diff --git
a/libcfs/libcfs/linux/linux-module.c
b/libcfs/libcfs/linux/linux-module.c
index
6d841b4
..
7175e44
100644
(file)
--- a/
libcfs/libcfs/linux/linux-module.c
+++ b/
libcfs/libcfs/linux/linux-module.c
@@
-27,7
+27,7
@@
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012,
2014,
Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
/*
* This file is part of Lustre, http://www.lustre.org/
@@
-42,8
+42,10
@@
int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data)
{
int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data)
{
+ ENTRY;
+
if (libcfs_ioctl_is_invalid(data)) {
if (libcfs_ioctl_is_invalid(data)) {
- CERROR("
LNET: ioctl
not correctly formatted\n");
+ CERROR("
libcfs ioctl: parameter
not correctly formatted\n");
RETURN(-EINVAL);
}
RETURN(-EINVAL);
}
@@
-52,52
+54,52
@@
int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data)
if (data->ioc_inllen2 != 0)
data->ioc_inlbuf2 = &data->ioc_bulk[0] +
if (data->ioc_inllen2 != 0)
data->ioc_inlbuf2 = &data->ioc_bulk[0] +
- cfs_size_round(data->ioc_inllen1);
+
cfs_size_round(data->ioc_inllen1);
RETURN(0);
}
RETURN(0);
}
-int libcfs_ioctl_getdata
_len(const struct libcfs_ioctl_hdr __user *arg
,
-
__u32 *len
)
+int libcfs_ioctl_getdata
(struct libcfs_ioctl_hdr **hdr_pp
,
+
struct libcfs_ioctl_hdr __user *uhdr
)
{
{
- struct libcfs_ioctl_hdr hdr;
+ struct libcfs_ioctl_hdr hdr;
+ int err = 0;
ENTRY;
ENTRY;
- if (copy_from_user(&hdr,
arg
, sizeof(hdr)))
+ if (copy_from_user(&hdr,
uhdr
, sizeof(hdr)))
RETURN(-EFAULT);
if (hdr.ioc_version != LIBCFS_IOCTL_VERSION &&
hdr.ioc_version != LIBCFS_IOCTL_VERSION2) {
RETURN(-EFAULT);
if (hdr.ioc_version != LIBCFS_IOCTL_VERSION &&
hdr.ioc_version != LIBCFS_IOCTL_VERSION2) {
- CERROR("
LNET
: version mismatch expected %#x, got %#x\n",
+ CERROR("
libcfs ioctl
: version mismatch expected %#x, got %#x\n",
LIBCFS_IOCTL_VERSION, hdr.ioc_version);
RETURN(-EINVAL);
}
LIBCFS_IOCTL_VERSION, hdr.ioc_version);
RETURN(-EINVAL);
}
- *len = hdr.ioc_len;
+ if (hdr.ioc_len < sizeof(struct libcfs_ioctl_hdr)) {
+ CERROR("libcfs ioctl: user buffer too small for ioctl\n");
+ RETURN(-EINVAL);
+ }
- RETURN(0);
-}
+ if (hdr.ioc_len > LIBCFS_IOC_DATA_MAX) {
+ CERROR("libcfs ioctl: user buffer is too large %d/%d\n",
+ hdr.ioc_len, LIBCFS_IOC_DATA_MAX);
+ RETURN(-EINVAL);
+ }
-int libcfs_ioctl_getdata(struct libcfs_ioctl_hdr *buf, __u32 buf_len,
- const void __user *arg)
-{
- ENTRY;
+ LIBCFS_ALLOC(*hdr_pp, hdr.ioc_len);
+ if (*hdr_pp == NULL)
+ RETURN(-ENOMEM);
- if (copy_from_user(
buf, arg, buf
_len))
-
RETURN(-EINVAL
);
+ if (copy_from_user(
*hdr_pp, uhdr, hdr.ioc
_len))
+
GOTO(failed, err = -EFAULT
);
RETURN(0);
RETURN(0);
+failed:
+ libcfs_ioctl_freedata(*hdr_pp);
+ RETURN(err);
}
}
-int libcfs_ioctl_popdata(void *arg, void *data, int size)
-{
- if (copy_to_user((char *)arg, data, size))
- return -EFAULT;
- return 0;
-}
-
-extern struct cfs_psdev_ops libcfs_psdev_ops;
-
static int
libcfs_psdev_open(struct inode * inode, struct file * file)
{
static int
libcfs_psdev_open(struct inode * inode, struct file * file)
{
@@
-164,7
+166,7
@@
static long libcfs_ioctl(struct file *file,
pfile.off = 0;
pfile.private_data = file->private_data;
if (libcfs_psdev_ops.p_ioctl != NULL)
pfile.off = 0;
pfile.private_data = file->private_data;
if (libcfs_psdev_ops.p_ioctl != NULL)
- rc = libcfs_psdev_ops.p_ioctl(&pfile, cmd, (void *)arg);
+ rc = libcfs_psdev_ops.p_ioctl(&pfile, cmd, (void
__user
*)arg);
else
rc = -EPERM;
return (rc);
else
rc = -EPERM;
return (rc);