diff options
-rw-r--r-- | net/sctp/ipv6.c | 12 | ||||
-rw-r--r-- | net/sctp/protocol.c | 8 |
2 files changed, 11 insertions, 9 deletions
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index bbf15341eb2b..a18cda60e156 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -582,7 +582,7 @@ static int sctp_v6_available(union sctp_addr *addr, struct sctp_sock *sp) | |||
582 | if (!(type & IPV6_ADDR_UNICAST)) | 582 | if (!(type & IPV6_ADDR_UNICAST)) |
583 | return 0; | 583 | return 0; |
584 | 584 | ||
585 | return ipv6_chk_addr(&init_net, in6, NULL, 0); | 585 | return ipv6_chk_addr(sock_net(&sp->inet.sk), in6, NULL, 0); |
586 | } | 586 | } |
587 | 587 | ||
588 | /* This function checks if the address is a valid address to be used for | 588 | /* This function checks if the address is a valid address to be used for |
@@ -859,14 +859,14 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr) | |||
859 | struct net_device *dev; | 859 | struct net_device *dev; |
860 | 860 | ||
861 | if (type & IPV6_ADDR_LINKLOCAL) { | 861 | if (type & IPV6_ADDR_LINKLOCAL) { |
862 | struct net *net; | ||
862 | if (!addr->v6.sin6_scope_id) | 863 | if (!addr->v6.sin6_scope_id) |
863 | return 0; | 864 | return 0; |
865 | net = sock_net(&opt->inet.sk); | ||
864 | rcu_read_lock(); | 866 | rcu_read_lock(); |
865 | dev = dev_get_by_index_rcu(&init_net, | 867 | dev = dev_get_by_index_rcu(net, addr->v6.sin6_scope_id); |
866 | addr->v6.sin6_scope_id); | ||
867 | if (!dev || | 868 | if (!dev || |
868 | !ipv6_chk_addr(&init_net, &addr->v6.sin6_addr, | 869 | !ipv6_chk_addr(net, &addr->v6.sin6_addr, dev, 0)) { |
869 | dev, 0)) { | ||
870 | rcu_read_unlock(); | 870 | rcu_read_unlock(); |
871 | return 0; | 871 | return 0; |
872 | } | 872 | } |
@@ -899,7 +899,7 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr) | |||
899 | if (!addr->v6.sin6_scope_id) | 899 | if (!addr->v6.sin6_scope_id) |
900 | return 0; | 900 | return 0; |
901 | rcu_read_lock(); | 901 | rcu_read_lock(); |
902 | dev = dev_get_by_index_rcu(&init_net, | 902 | dev = dev_get_by_index_rcu(sock_net(&opt->inet.sk), |
903 | addr->v6.sin6_scope_id); | 903 | addr->v6.sin6_scope_id); |
904 | rcu_read_unlock(); | 904 | rcu_read_unlock(); |
905 | if (!dev) | 905 | if (!dev) |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index de7994edb4ca..059c914c09f2 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -367,7 +367,8 @@ static int sctp_v4_addr_valid(union sctp_addr *addr, | |||
367 | /* Should this be available for binding? */ | 367 | /* Should this be available for binding? */ |
368 | static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp) | 368 | static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp) |
369 | { | 369 | { |
370 | int ret = inet_addr_type(&init_net, addr->v4.sin_addr.s_addr); | 370 | struct net *net = sock_net(&sp->inet.sk); |
371 | int ret = inet_addr_type(net, addr->v4.sin_addr.s_addr); | ||
371 | 372 | ||
372 | 373 | ||
373 | if (addr->v4.sin_addr.s_addr != htonl(INADDR_ANY) && | 374 | if (addr->v4.sin_addr.s_addr != htonl(INADDR_ANY) && |
@@ -454,7 +455,7 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
454 | SCTP_DEBUG_PRINTK("%s: DST:%pI4, SRC:%pI4 - ", | 455 | SCTP_DEBUG_PRINTK("%s: DST:%pI4, SRC:%pI4 - ", |
455 | __func__, &fl4->daddr, &fl4->saddr); | 456 | __func__, &fl4->daddr, &fl4->saddr); |
456 | 457 | ||
457 | rt = ip_route_output_key(&init_net, fl4); | 458 | rt = ip_route_output_key(sock_net(sk), fl4); |
458 | if (!IS_ERR(rt)) | 459 | if (!IS_ERR(rt)) |
459 | dst = &rt->dst; | 460 | dst = &rt->dst; |
460 | 461 | ||
@@ -500,7 +501,7 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
500 | (AF_INET == laddr->a.sa.sa_family)) { | 501 | (AF_INET == laddr->a.sa.sa_family)) { |
501 | fl4->saddr = laddr->a.v4.sin_addr.s_addr; | 502 | fl4->saddr = laddr->a.v4.sin_addr.s_addr; |
502 | fl4->fl4_sport = laddr->a.v4.sin_port; | 503 | fl4->fl4_sport = laddr->a.v4.sin_port; |
503 | rt = ip_route_output_key(&init_net, fl4); | 504 | rt = ip_route_output_key(sock_net(sk), fl4); |
504 | if (!IS_ERR(rt)) { | 505 | if (!IS_ERR(rt)) { |
505 | dst = &rt->dst; | 506 | dst = &rt->dst; |
506 | goto out_unlock; | 507 | goto out_unlock; |
@@ -1033,6 +1034,7 @@ static const struct net_protocol sctp_protocol = { | |||
1033 | .handler = sctp_rcv, | 1034 | .handler = sctp_rcv, |
1034 | .err_handler = sctp_v4_err, | 1035 | .err_handler = sctp_v4_err, |
1035 | .no_policy = 1, | 1036 | .no_policy = 1, |
1037 | .netns_ok = 1, | ||
1036 | }; | 1038 | }; |
1037 | 1039 | ||
1038 | /* IPv4 address related functions. */ | 1040 | /* IPv4 address related functions. */ |