diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 31 | 
1 files changed, 14 insertions, 17 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 3708de2a6683..32b048e524d6 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1018,27 +1018,28 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,  			      GFP_KERNEL);  } -static int tcp_v4_md5_hash_pseudoheader(struct tcp_md5sig_pool *hp, -					__be32 daddr, __be32 saddr, int nbytes) +static int tcp_v4_md5_hash_headers(struct tcp_md5sig_pool *hp, +				   __be32 daddr, __be32 saddr, +				   const struct tcphdr *th, int nbytes)  {  	struct tcp4_pseudohdr *bp;  	struct scatterlist sg; +	struct tcphdr *_th; -	bp = &hp->md5_blk.ip4; - -	/* -	 * 1. the TCP pseudo-header (in the order: source IP address, -	 * destination IP address, zero-padded protocol number, and -	 * segment length) -	 */ +	bp = hp->scratch;  	bp->saddr = saddr;  	bp->daddr = daddr;  	bp->pad = 0;  	bp->protocol = IPPROTO_TCP;  	bp->len = cpu_to_be16(nbytes); -	sg_init_one(&sg, bp, sizeof(*bp)); -	ahash_request_set_crypt(hp->md5_req, &sg, NULL, sizeof(*bp)); +	_th = (struct tcphdr *)(bp + 1); +	memcpy(_th, th, sizeof(*th)); +	_th->check = 0; + +	sg_init_one(&sg, bp, sizeof(*bp) + sizeof(*th)); +	ahash_request_set_crypt(hp->md5_req, &sg, NULL, +				sizeof(*bp) + sizeof(*th));  	return crypto_ahash_update(hp->md5_req);  } @@ -1055,9 +1056,7 @@ static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,  	if (crypto_ahash_init(req))  		goto clear_hash; -	if (tcp_v4_md5_hash_pseudoheader(hp, daddr, saddr, th->doff << 2)) -		goto clear_hash; -	if (tcp_md5_hash_header(hp, th)) +	if (tcp_v4_md5_hash_headers(hp, daddr, saddr, th, th->doff << 2))  		goto clear_hash;  	if (tcp_md5_hash_key(hp, key))  		goto clear_hash; @@ -1101,9 +1100,7 @@ int tcp_v4_md5_hash_skb(char *md5_hash, const struct tcp_md5sig_key *key,  	if (crypto_ahash_init(req))  		goto clear_hash; -	if (tcp_v4_md5_hash_pseudoheader(hp, daddr, saddr, skb->len)) -		goto clear_hash; -	if (tcp_md5_hash_header(hp, th)) +	if (tcp_v4_md5_hash_headers(hp, daddr, saddr, th, skb->len))  		goto clear_hash;  	if (tcp_md5_hash_skb_data(hp, skb, th->doff << 2))  		goto clear_hash;  |