[DCCP]: Set socket owner iff packet is not data
authorHerbert Xu <herbert@gondor.apana.org.au>
Sun, 30 Oct 2005 00:20:59 +0000 (11:20 +1100)
committerArnaldo Carvalho de Melo <acme@mandriva.com>
Tue, 1 Nov 2005 00:30:02 +0000 (22:30 -0200)
Here is a complimentary insurance policy for those feeling a bit insecure.
You don't have to accept this.  However, if you do, you can't blame me for
it :)

> 1) dccp_transmit_skb sets the owner for all packets except data packets.

We can actually verify this by looking at pkt_type.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
net/dccp/output.c

index c25b0423887adecc2c00cdc601ccacf42f987c13..74ff870258785b3790bb325b62aebe2435f3769a 100644 (file)
@@ -58,10 +58,21 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                switch (dcb->dccpd_type) {
                case DCCP_PKT_DATA:
                        set_ack = 0;
+                       /* fall through */
+               case DCCP_PKT_DATAACK:
                        break;
+
                case DCCP_PKT_SYNC:
                case DCCP_PKT_SYNCACK:
                        ackno = dcb->dccpd_seq;
+                       /* fall through */
+               default:
+                       /*
+                        * Only data packets should come through with skb->sk
+                        * set.
+                        */
+                       WARN_ON(skb->sk);
+                       skb_set_owner_w(skb, sk);
                        break;
                }
 
@@ -71,12 +82,6 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                skb->h.raw = skb_push(skb, dccp_header_size);
                dh = dccp_hdr(skb);
 
-               /*
-                * Only data packets should come through with skb->sk set.
-                */
-               if (!skb->sk)
-                       skb_set_owner_w(skb, sk);
-
                /* Build DCCP header and checksum it. */
                memset(dh, 0, dccp_header_size);
                dh->dccph_type  = dcb->dccpd_type;