Skip to content

Commit 6dff362

Browse files
Several skb_fragment and ss_skb_data_ptr_by_offset
- We should check that skb has linear part (d_size != 0) in `skb_fragment` because if it is not true, skb->data can points to incorrect place (for example address of skb fragment!) if this skb was previosly passed to `__split_linear_data`. - Fix calculation of place to insert frame header in `ss_skb_data_ptr_by_offset`. If data points to the end of (linear data/fragment) we should use next (zero fragment/next fragment) not current one.
1 parent 11853e1 commit 6dff362

File tree

2 files changed

+6
-9
lines changed

2 files changed

+6
-9
lines changed

fw/ss_skb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ __skb_fragment(struct sk_buff *skb_head, struct sk_buff *skb, char *pspt,
683683
* advance the skb tail pointer.
684684
*/
685685
if (len > 0) {
686-
offset = unlikely(offset == d_size) ? 0 :
686+
offset = unlikely(d_size && offset == d_size) ? 0 :
687687
pspt - (char *)skb_frag_address(&si->frags[0]);
688688
if (unlikely(!offset)) {
689689
if (!(ret = __split_try_tailroom(skb, len, it)))

fw/ss_skb.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -409,14 +409,13 @@ static inline char *
409409
ss_skb_data_ptr_by_offset(struct sk_buff *skb, unsigned int off)
410410
{
411411
char *begin, *end;
412-
unsigned long d;
413412
unsigned char i;
414413

415414
if (skb_headlen(skb)) {
416415
begin = skb->data;
417416
end = begin + skb_headlen(skb);
418417

419-
if (begin + off <= end)
418+
if (ss_skb_is_within_fragment(begin, begin + off, end))
420419
return begin + off;
421420
off -= skb_headlen(skb);
422421
}
@@ -426,13 +425,11 @@ ss_skb_data_ptr_by_offset(struct sk_buff *skb, unsigned int off)
426425

427426
begin = skb_frag_address(f);
428427
end = begin + skb_frag_size(f);
429-
d = end - begin;
430428

431-
if (off > d) {
432-
off -= d;
433-
continue;
434-
}
435-
return begin + off;
429+
if (ss_skb_is_within_fragment(begin, begin + off, end))
430+
return begin + off;
431+
432+
off -= (end - begin);
436433
}
437434

438435
return NULL;

0 commit comments

Comments
 (0)