tcp: md5: dont write skb head in tcp_md5_hash_header()
tcp_md5_hash_header() writes into skb header a temporary zero value, this might confuse other users of this area. Since tcphdr is small (20 bytes), copy it in a temporary variable and make the change in the copy. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
01718e36df
commit
ca35a0ef85
|
@ -1209,7 +1209,7 @@ extern void tcp_free_md5sig_pool(void);
|
||||||
extern struct tcp_md5sig_pool *tcp_get_md5sig_pool(void);
|
extern struct tcp_md5sig_pool *tcp_get_md5sig_pool(void);
|
||||||
extern void tcp_put_md5sig_pool(void);
|
extern void tcp_put_md5sig_pool(void);
|
||||||
|
|
||||||
extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, struct tcphdr *);
|
extern int tcp_md5_hash_header(struct tcp_md5sig_pool *, const struct tcphdr *);
|
||||||
extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, const struct sk_buff *,
|
extern int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *, const struct sk_buff *,
|
||||||
unsigned header_len);
|
unsigned header_len);
|
||||||
extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp,
|
extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp,
|
||||||
|
|
|
@ -2994,17 +2994,19 @@ void tcp_put_md5sig_pool(void)
|
||||||
EXPORT_SYMBOL(tcp_put_md5sig_pool);
|
EXPORT_SYMBOL(tcp_put_md5sig_pool);
|
||||||
|
|
||||||
int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
|
int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
|
||||||
struct tcphdr *th)
|
const struct tcphdr *th)
|
||||||
{
|
{
|
||||||
struct scatterlist sg;
|
struct scatterlist sg;
|
||||||
|
struct tcphdr hdr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
__sum16 old_checksum = th->check;
|
/* We are not allowed to change tcphdr, make a local copy */
|
||||||
th->check = 0;
|
memcpy(&hdr, th, sizeof(hdr));
|
||||||
|
hdr.check = 0;
|
||||||
|
|
||||||
/* options aren't included in the hash */
|
/* options aren't included in the hash */
|
||||||
sg_init_one(&sg, th, sizeof(struct tcphdr));
|
sg_init_one(&sg, &hdr, sizeof(hdr));
|
||||||
err = crypto_hash_update(&hp->md5_desc, &sg, sizeof(struct tcphdr));
|
err = crypto_hash_update(&hp->md5_desc, &sg, sizeof(hdr));
|
||||||
th->check = old_checksum;
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(tcp_md5_hash_header);
|
EXPORT_SYMBOL(tcp_md5_hash_header);
|
||||||
|
|
Loading…
Reference in New Issue