提交 ca35a0ef 编写于 作者: E Eric Dumazet 提交者: David S. Miller

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: NEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 01718e36
...@@ -1209,7 +1209,7 @@ extern void tcp_free_md5sig_pool(void); ...@@ -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) ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册