diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 11 | 
1 files changed, 7 insertions, 4 deletions
| diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index c34f01513945..7963e03f1068 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -927,18 +927,21 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,  			}  			sk_nocaps_add(sk, NETIF_F_GSO_MASK);  		} -		if (tcp_alloc_md5sig_pool(sk) == NULL) { + +		md5sig = tp->md5sig_info; +		if (md5sig->entries4 == 0 && +		    tcp_alloc_md5sig_pool(sk) == NULL) {  			kfree(newkey);  			return -ENOMEM;  		} -		md5sig = tp->md5sig_info;  		if (md5sig->alloced4 == md5sig->entries4) {  			keys = kmalloc((sizeof(*keys) *  					(md5sig->entries4 + 1)), GFP_ATOMIC);  			if (!keys) {  				kfree(newkey); -				tcp_free_md5sig_pool(); +				if (md5sig->entries4 == 0) +					tcp_free_md5sig_pool();  				return -ENOMEM;  			} @@ -982,6 +985,7 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)  				kfree(tp->md5sig_info->keys4);  				tp->md5sig_info->keys4 = NULL;  				tp->md5sig_info->alloced4 = 0; +				tcp_free_md5sig_pool();  			} else if (tp->md5sig_info->entries4 != i) {  				/* Need to do some manipulation */  				memmove(&tp->md5sig_info->keys4[i], @@ -989,7 +993,6 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)  					(tp->md5sig_info->entries4 - i) *  					 sizeof(struct tcp4_md5sig_key));  			} -			tcp_free_md5sig_pool();  			return 0;  		}  	} | 
