Commit 79246cb05913bd4262514210136d087c1beb6d3b
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 |
net/sched/sch_sfb.c
... | ... | @@ -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 |