act_pedit: access skb->data safely
Subsystems (3)
PATCH 1/1 act_pedit: access skb->data safely
access skb->data safely
we should use skb_header_pointer() and skb_store_bits() to access skb->data to handle small or non-linear skbs.
Signed-off-by Changli Gao <[email protected]>
----
net/sched/act_pedit.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
net/sched/act_pedit.c +14 -10
@@ -125,7 +125,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, {struct tcf_pedit *p = a->priv;int i, munged =0 ; -u8 *pptr; +unsigned int off;if (!(skb->tc_verd &TC_OK2MUNGE )) {/* should we set skb->cloned? */
@@ -134,7 +134,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, } } - pptr =skb_network_header (skb); + off =skb_network_offset (skb);spin_lock (&p->tcf_lock);
@@ -144,17 +144,17 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,struct tc_pedit_key *tkey = p->tcfp_keys;for (i = p->tcfp_nkeys; i >0 ; i--, tkey++) { -u32 *ptr; +u32 *ptr, _data;int offset = tkey->off;if (tkey->offmask) { -if (skb->len > tkey->at) { -char *j = pptr + tkey->at; - offset += ((*j & tkey->offmask) >> - tkey->shift); - }else { +char *d, _d; + + d =skb_header_pointer (skb, off + tkey->at,1 , + &_d); +if (!d) goto bad; - } + offset += (*d & tkey->offmask) >> tkey->shift; }if (offset %4 ) {
@@ -169,9 +169,13 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, goto bad; } - ptr = (u32 *)(pptr+offset); + ptr =skb_header_pointer (skb, off + offset,4 , &_data); +if (!ptr) + goto bad;/* just do it, baby */ *ptr = ((*ptr & tkey->mask) ^ tkey->val); +if (ptr == &_data) +skb_store_bits (skb, off + offset, ptr,4 ); munged++; }
From: Changli Gao <[email protected]>
Date: Wed, 2 Jun 2010 22:55:02 +0800
Quoted 6 lines
access
skb->datasafelywe should use
skb_header_pointer()andskb_store_bits()to accessskb->datato handle small or non-linear skbs.Signed-off-by Changli Gao <[email protected]>
Applied.