mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
ipv6: move SIOCADDRT and SIOCDELRT handling into ->compat_ioctl
To prepare removing the global routing_ioctl hack start lifting the code into a newly added ipv6 ->compat_ioctl handler. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7c1552da90
commit
3986912f6a
8 changed files with 76 additions and 45 deletions
61
net/socket.c
61
net/socket.c
|
@ -3384,62 +3384,33 @@ struct rtentry32 {
|
|||
unsigned short rt_irtt; /* Initial RTT */
|
||||
};
|
||||
|
||||
struct in6_rtmsg32 {
|
||||
struct in6_addr rtmsg_dst;
|
||||
struct in6_addr rtmsg_src;
|
||||
struct in6_addr rtmsg_gateway;
|
||||
u32 rtmsg_type;
|
||||
u16 rtmsg_dst_len;
|
||||
u16 rtmsg_src_len;
|
||||
u32 rtmsg_metric;
|
||||
u32 rtmsg_info;
|
||||
u32 rtmsg_flags;
|
||||
s32 rtmsg_ifindex;
|
||||
};
|
||||
|
||||
static int routing_ioctl(struct net *net, struct socket *sock,
|
||||
unsigned int cmd, void __user *argp)
|
||||
{
|
||||
struct rtentry32 __user *ur4 = argp;
|
||||
int ret;
|
||||
void *r = NULL;
|
||||
struct in6_rtmsg r6;
|
||||
struct rtentry r4;
|
||||
char devname[16];
|
||||
u32 rtdev;
|
||||
mm_segment_t old_fs = get_fs();
|
||||
|
||||
if (sock && sock->sk && sock->sk->sk_family == AF_INET6) { /* ipv6 */
|
||||
struct in6_rtmsg32 __user *ur6 = argp;
|
||||
ret = copy_from_user(&r6.rtmsg_dst, &(ur6->rtmsg_dst),
|
||||
3 * sizeof(struct in6_addr));
|
||||
ret |= get_user(r6.rtmsg_type, &(ur6->rtmsg_type));
|
||||
ret |= get_user(r6.rtmsg_dst_len, &(ur6->rtmsg_dst_len));
|
||||
ret |= get_user(r6.rtmsg_src_len, &(ur6->rtmsg_src_len));
|
||||
ret |= get_user(r6.rtmsg_metric, &(ur6->rtmsg_metric));
|
||||
ret |= get_user(r6.rtmsg_info, &(ur6->rtmsg_info));
|
||||
ret |= get_user(r6.rtmsg_flags, &(ur6->rtmsg_flags));
|
||||
ret |= get_user(r6.rtmsg_ifindex, &(ur6->rtmsg_ifindex));
|
||||
ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
|
||||
3 * sizeof(struct sockaddr));
|
||||
ret |= get_user(r4.rt_flags, &(ur4->rt_flags));
|
||||
ret |= get_user(r4.rt_metric, &(ur4->rt_metric));
|
||||
ret |= get_user(r4.rt_mtu, &(ur4->rt_mtu));
|
||||
ret |= get_user(r4.rt_window, &(ur4->rt_window));
|
||||
ret |= get_user(r4.rt_irtt, &(ur4->rt_irtt));
|
||||
ret |= get_user(rtdev, &(ur4->rt_dev));
|
||||
if (rtdev) {
|
||||
ret |= copy_from_user(devname, compat_ptr(rtdev), 15);
|
||||
r4.rt_dev = (char __user __force *)devname;
|
||||
devname[15] = 0;
|
||||
} else
|
||||
r4.rt_dev = NULL;
|
||||
|
||||
r = (void *) &r6;
|
||||
} else { /* ipv4 */
|
||||
struct rtentry32 __user *ur4 = argp;
|
||||
ret = copy_from_user(&r4.rt_dst, &(ur4->rt_dst),
|
||||
3 * sizeof(struct sockaddr));
|
||||
ret |= get_user(r4.rt_flags, &(ur4->rt_flags));
|
||||
ret |= get_user(r4.rt_metric, &(ur4->rt_metric));
|
||||
ret |= get_user(r4.rt_mtu, &(ur4->rt_mtu));
|
||||
ret |= get_user(r4.rt_window, &(ur4->rt_window));
|
||||
ret |= get_user(r4.rt_irtt, &(ur4->rt_irtt));
|
||||
ret |= get_user(rtdev, &(ur4->rt_dev));
|
||||
if (rtdev) {
|
||||
ret |= copy_from_user(devname, compat_ptr(rtdev), 15);
|
||||
r4.rt_dev = (char __user __force *)devname;
|
||||
devname[15] = 0;
|
||||
} else
|
||||
r4.rt_dev = NULL;
|
||||
|
||||
r = (void *) &r4;
|
||||
}
|
||||
r = (void *) &r4;
|
||||
|
||||
if (ret) {
|
||||
ret = -EFAULT;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue