tcp: md5: dont write skb head in tcp_md5_hash_header()
authorEric Dumazet <eric.dumazet@gmail.com>
Mon, 24 Oct 2011 05:52:35 +0000 (01:52 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Oct 2011 05:52:35 +0000 (01:52 -0400)
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>
include/net/tcp.h
net/ipv4/tcp.c

index 3edef0bebdd1adede80ab8c2b2dd86c73603bb4f..910cc29f9e979009dcc8b9d5d5b5952aa6a1a77f 100644 (file)
@@ -1209,7 +1209,7 @@ extern void tcp_free_md5sig_pool(void);
 extern struct tcp_md5sig_pool  *tcp_get_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 *,
                                 unsigned header_len);
 extern int tcp_md5_hash_key(struct tcp_md5sig_pool *hp,
index 704adad8f07f782426f2d599a197ebfda553b099..eefc61e3d0e4223633b4eca47036e3f9cf6164f4 100644 (file)
@@ -2994,17 +2994,19 @@ void tcp_put_md5sig_pool(void)
 EXPORT_SYMBOL(tcp_put_md5sig_pool);
 
 int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
-                       struct tcphdr *th)
+                       const struct tcphdr *th)
 {
        struct scatterlist sg;
+       struct tcphdr hdr;
        int err;
 
-       __sum16 old_checksum = th->check;
-       th->check = 0;
+       /* We are not allowed to change tcphdr, make a local copy */
+       memcpy(&hdr, th, sizeof(hdr));
+       hdr.check = 0;
+
        /* options aren't included in the hash */
-       sg_init_one(&sg, th, sizeof(struct tcphdr));
-       err = crypto_hash_update(&hp->md5_desc, &sg, sizeof(struct tcphdr));
-       th->check = old_checksum;
+       sg_init_one(&sg, &hdr, sizeof(hdr));
+       err = crypto_hash_update(&hp->md5_desc, &sg, sizeof(hdr));
        return err;
 }
 EXPORT_SYMBOL(tcp_md5_hash_header);