aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/raw.c')
-rw-r--r--net/ipv6/raw.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 6a79f3081bdb..331af3b882ac 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -61,6 +61,7 @@
61 61
62#include <linux/proc_fs.h> 62#include <linux/proc_fs.h>
63#include <linux/seq_file.h> 63#include <linux/seq_file.h>
64#include <linux/export.h>
64 65
65static struct raw_hashinfo raw_v6_hashinfo = { 66static struct raw_hashinfo raw_v6_hashinfo = {
66 .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), 67 .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock),
@@ -130,14 +131,14 @@ static mh_filter_t __rcu *mh_filter __read_mostly;
130 131
131int rawv6_mh_filter_register(mh_filter_t filter) 132int rawv6_mh_filter_register(mh_filter_t filter)
132{ 133{
133 rcu_assign_pointer(mh_filter, filter); 134 RCU_INIT_POINTER(mh_filter, filter);
134 return 0; 135 return 0;
135} 136}
136EXPORT_SYMBOL(rawv6_mh_filter_register); 137EXPORT_SYMBOL(rawv6_mh_filter_register);
137 138
138int rawv6_mh_filter_unregister(mh_filter_t filter) 139int rawv6_mh_filter_unregister(mh_filter_t filter)
139{ 140{
140 rcu_assign_pointer(mh_filter, NULL); 141 RCU_INIT_POINTER(mh_filter, NULL);
141 synchronize_rcu(); 142 synchronize_rcu();
142 return 0; 143 return 0;
143} 144}
@@ -372,9 +373,9 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
372 read_unlock(&raw_v6_hashinfo.lock); 373 read_unlock(&raw_v6_hashinfo.lock);
373} 374}
374 375
375static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) 376static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb)
376{ 377{
377 if ((raw6_sk(sk)->checksum || rcu_dereference_raw(sk->sk_filter)) && 378 if ((raw6_sk(sk)->checksum || rcu_access_pointer(sk->sk_filter)) &&
378 skb_checksum_complete(skb)) { 379 skb_checksum_complete(skb)) {
379 atomic_inc(&sk->sk_drops); 380 atomic_inc(&sk->sk_drops);
380 kfree_skb(skb); 381 kfree_skb(skb);
@@ -542,8 +543,7 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
542 goto out; 543 goto out;
543 544
544 offset = rp->offset; 545 offset = rp->offset;
545 total_len = inet_sk(sk)->cork.base.length - (skb_network_header(skb) - 546 total_len = inet_sk(sk)->cork.base.length;
546 skb->data);
547 if (offset >= total_len - 1) { 547 if (offset >= total_len - 1) {
548 err = -EINVAL; 548 err = -EINVAL;
549 ip6_flush_pending_frames(sk); 549 ip6_flush_pending_frames(sk);
@@ -817,8 +817,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
817 memset(opt, 0, sizeof(struct ipv6_txoptions)); 817 memset(opt, 0, sizeof(struct ipv6_txoptions));
818 opt->tot_len = sizeof(struct ipv6_txoptions); 818 opt->tot_len = sizeof(struct ipv6_txoptions);
819 819
820 err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit, 820 err = datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt,
821 &tclass, &dontfrag); 821 &hlimit, &tclass, &dontfrag);
822 if (err < 0) { 822 if (err < 0) {
823 fl6_sock_release(flowlabel); 823 fl6_sock_release(flowlabel);
824 return err; 824 return err;