diff options
Diffstat (limited to 'drivers/net/pppol2tp.c')
-rw-r--r-- | drivers/net/pppol2tp.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 9fbb2eba9a06..449a9825200d 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -756,6 +756,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) | |||
756 | 756 | ||
757 | /* Try to dequeue as many skbs from reorder_q as we can. */ | 757 | /* Try to dequeue as many skbs from reorder_q as we can. */ |
758 | pppol2tp_recv_dequeue(session); | 758 | pppol2tp_recv_dequeue(session); |
759 | sock_put(sock); | ||
759 | 760 | ||
760 | return 0; | 761 | return 0; |
761 | 762 | ||
@@ -772,6 +773,7 @@ discard_bad_csum: | |||
772 | UDP_INC_STATS_USER(&init_net, UDP_MIB_INERRORS, 0); | 773 | UDP_INC_STATS_USER(&init_net, UDP_MIB_INERRORS, 0); |
773 | tunnel->stats.rx_errors++; | 774 | tunnel->stats.rx_errors++; |
774 | kfree_skb(skb); | 775 | kfree_skb(skb); |
776 | sock_put(sock); | ||
775 | 777 | ||
776 | return 0; | 778 | return 0; |
777 | 779 | ||
@@ -1180,7 +1182,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
1180 | /* Calculate UDP checksum if configured to do so */ | 1182 | /* Calculate UDP checksum if configured to do so */ |
1181 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) | 1183 | if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) |
1182 | skb->ip_summed = CHECKSUM_NONE; | 1184 | skb->ip_summed = CHECKSUM_NONE; |
1183 | else if (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM)) { | 1185 | else if ((skb_dst(skb) && skb_dst(skb)->dev) && |
1186 | (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) { | ||
1184 | skb->ip_summed = CHECKSUM_COMPLETE; | 1187 | skb->ip_summed = CHECKSUM_COMPLETE; |
1185 | csum = skb_checksum(skb, 0, udp_len, 0); | 1188 | csum = skb_checksum(skb, 0, udp_len, 0); |
1186 | uh->check = csum_tcpudp_magic(inet->inet_saddr, | 1189 | uh->check = csum_tcpudp_magic(inet->inet_saddr, |
@@ -1661,6 +1664,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
1661 | if (tunnel_sock == NULL) | 1664 | if (tunnel_sock == NULL) |
1662 | goto end; | 1665 | goto end; |
1663 | 1666 | ||
1667 | sock_hold(tunnel_sock); | ||
1664 | tunnel = tunnel_sock->sk_user_data; | 1668 | tunnel = tunnel_sock->sk_user_data; |
1665 | } else { | 1669 | } else { |
1666 | tunnel = pppol2tp_tunnel_find(sock_net(sk), sp->pppol2tp.s_tunnel); | 1670 | tunnel = pppol2tp_tunnel_find(sock_net(sk), sp->pppol2tp.s_tunnel); |