Commit 79246cb05913bd4262514210136d087c1beb6d3b

Authored by David S. Miller
Committed by Greg Kroah-Hartman
1 parent 763fe579c1

net: Make qdisc_skb_cb upper size bound explicit.

[ Upstream commit 16bda13d90c8d5da243e2cfa1677e62ecce26860 ]

Just like skb->cb[], so that qdisc_skb_cb can be encapsulated inside
of other data structures.

This is intended to be used by IPoIB so that it can remember
addressing information stored at hard_header_ops->create() time that
it can fetch when the packet gets to the transmit routine.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 4 changed files with 11 additions and 7 deletions Side-by-side Diff

include/net/sch_generic.h
... ... @@ -220,8 +220,15 @@
220 220  
221 221 struct qdisc_skb_cb {
222 222 unsigned int pkt_len;
223   - long data[];
  223 + unsigned char data[24];
224 224 };
  225 +
  226 +static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
  227 +{
  228 + struct qdisc_skb_cb *qcb;
  229 + BUILD_BUG_ON(sizeof(skb->cb) < sizeof(unsigned int) + sz);
  230 + BUILD_BUG_ON(sizeof(qcb->data) < sz);
  231 +}
225 232  
226 233 static inline int qdisc_qlen(const struct Qdisc *q)
227 234 {
net/sched/sch_choke.c
... ... @@ -225,8 +225,7 @@
225 225  
226 226 static inline struct choke_skb_cb *choke_skb_cb(const struct sk_buff *skb)
227 227 {
228   - BUILD_BUG_ON(sizeof(skb->cb) <
229   - sizeof(struct qdisc_skb_cb) + sizeof(struct choke_skb_cb));
  228 + qdisc_cb_private_validate(skb, sizeof(struct choke_skb_cb));
230 229 return (struct choke_skb_cb *)qdisc_skb_cb(skb)->data;
231 230 }
232 231  
net/sched/sch_netem.c
... ... @@ -118,8 +118,7 @@
118 118  
119 119 static inline struct netem_skb_cb *netem_skb_cb(struct sk_buff *skb)
120 120 {
121   - BUILD_BUG_ON(sizeof(skb->cb) <
122   - sizeof(struct qdisc_skb_cb) + sizeof(struct netem_skb_cb));
  121 + qdisc_cb_private_validate(skb, sizeof(struct netem_skb_cb));
123 122 return (struct netem_skb_cb *)qdisc_skb_cb(skb)->data;
124 123 }
125 124  
... ... @@ -93,8 +93,7 @@
93 93  
94 94 static inline struct sfb_skb_cb *sfb_skb_cb(const struct sk_buff *skb)
95 95 {
96   - BUILD_BUG_ON(sizeof(skb->cb) <
97   - sizeof(struct qdisc_skb_cb) + sizeof(struct sfb_skb_cb));
  96 + qdisc_cb_private_validate(skb, sizeof(struct sfb_skb_cb));
98 97 return (struct sfb_skb_cb *)qdisc_skb_cb(skb)->data;
99 98 }
100 99