net: fix compat_sys_recvmmsg parameter type
compat_sys_recvmmsg has a compat_timespec parameter and not a timespec parameter. This way we also get rid of an odd cast. Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ccdddf500f
commit
60c2ffd3d2
|
@ -46,7 +46,7 @@ extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsi
|
||||||
extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned);
|
extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned);
|
||||||
extern asmlinkage long compat_sys_recvmmsg(int, struct compat_mmsghdr __user *,
|
extern asmlinkage long compat_sys_recvmmsg(int, struct compat_mmsghdr __user *,
|
||||||
unsigned, unsigned,
|
unsigned, unsigned,
|
||||||
struct timespec __user *);
|
struct compat_timespec __user *);
|
||||||
extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *);
|
extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *);
|
||||||
extern int put_cmsg_compat(struct msghdr*, int, int, int, void *);
|
extern int put_cmsg_compat(struct msghdr*, int, int, int, void *);
|
||||||
|
|
||||||
|
|
12
net/compat.c
12
net/compat.c
|
@ -754,26 +754,24 @@ asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len,
|
||||||
|
|
||||||
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||||
unsigned vlen, unsigned int flags,
|
unsigned vlen, unsigned int flags,
|
||||||
struct timespec __user *timeout)
|
struct compat_timespec __user *timeout)
|
||||||
{
|
{
|
||||||
int datagrams;
|
int datagrams;
|
||||||
struct timespec ktspec;
|
struct timespec ktspec;
|
||||||
struct compat_timespec __user *utspec;
|
|
||||||
|
|
||||||
if (timeout == NULL)
|
if (timeout == NULL)
|
||||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||||
flags | MSG_CMSG_COMPAT, NULL);
|
flags | MSG_CMSG_COMPAT, NULL);
|
||||||
|
|
||||||
utspec = (struct compat_timespec __user *)timeout;
|
if (get_user(ktspec.tv_sec, &timeout->tv_sec) ||
|
||||||
if (get_user(ktspec.tv_sec, &utspec->tv_sec) ||
|
get_user(ktspec.tv_nsec, &timeout->tv_nsec))
|
||||||
get_user(ktspec.tv_nsec, &utspec->tv_nsec))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||||
flags | MSG_CMSG_COMPAT, &ktspec);
|
flags | MSG_CMSG_COMPAT, &ktspec);
|
||||||
if (datagrams > 0 &&
|
if (datagrams > 0 &&
|
||||||
(put_user(ktspec.tv_sec, &utspec->tv_sec) ||
|
(put_user(ktspec.tv_sec, &timeout->tv_sec) ||
|
||||||
put_user(ktspec.tv_nsec, &utspec->tv_nsec)))
|
put_user(ktspec.tv_nsec, &timeout->tv_nsec)))
|
||||||
datagrams = -EFAULT;
|
datagrams = -EFAULT;
|
||||||
|
|
||||||
return datagrams;
|
return datagrams;
|
||||||
|
|
Loading…
Reference in New Issue