diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 11 | 
1 files changed, 8 insertions, 3 deletions
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 3c9fa618b69d..7b8fc5794352 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -591,7 +591,8 @@ static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,  			}  			sk_nocaps_add(sk, NETIF_F_GSO_MASK);  		} -		if (tcp_alloc_md5sig_pool(sk) == NULL) { +		if (tp->md5sig_info->entries6 == 0 && +			tcp_alloc_md5sig_pool(sk) == NULL) {  			kfree(newkey);  			return -ENOMEM;  		} @@ -600,8 +601,9 @@ static int tcp_v6_md5_do_add(struct sock *sk, const struct in6_addr *peer,  				       (tp->md5sig_info->entries6 + 1)), GFP_ATOMIC);  			if (!keys) { -				tcp_free_md5sig_pool();  				kfree(newkey); +				if (tp->md5sig_info->entries6 == 0) +					tcp_free_md5sig_pool();  				return -ENOMEM;  			} @@ -647,6 +649,7 @@ static int tcp_v6_md5_do_del(struct sock *sk, const struct in6_addr *peer)  				kfree(tp->md5sig_info->keys6);  				tp->md5sig_info->keys6 = NULL;  				tp->md5sig_info->alloced6 = 0; +				tcp_free_md5sig_pool();  			} else {  				/* shrink the database */  				if (tp->md5sig_info->entries6 != i) @@ -655,7 +658,6 @@ static int tcp_v6_md5_do_del(struct sock *sk, const struct in6_addr *peer)  						(tp->md5sig_info->entries6 - i)  						* sizeof (tp->md5sig_info->keys6[0]));  			} -			tcp_free_md5sig_pool();  			return 0;  		}  	} @@ -1383,6 +1385,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,  		newtp->af_specific = &tcp_sock_ipv6_mapped_specific;  #endif +		newnp->ipv6_ac_list = NULL; +		newnp->ipv6_fl_list = NULL;  		newnp->pktoptions  = NULL;  		newnp->opt	   = NULL;  		newnp->mcast_oif   = inet6_iif(skb); @@ -1447,6 +1451,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,  	   First: no IPv4 options.  	 */  	newinet->inet_opt = NULL; +	newnp->ipv6_ac_list = NULL;  	newnp->ipv6_fl_list = NULL;  	/* Clone RX bits */ | 
