diff options
| author | Siluxsept <ronny.horn.rh@gmail.com> | 2024-02-06 04:37:40 +0100 |
|---|---|---|
| committer | Siluxsept <ronny.horn.rh@gmail.com> | 2024-02-06 04:38:56 +0100 |
| commit | 8e8137ac800bdc27181743ec73d0e90e28b4e8af (patch) | |
| tree | 7e2fbc9d9e305e46414c21d08eeaeb1d56ccb0f0 /net/core/skbuff.c | |
| parent | 9c2f9bfc860f0cd6f2d3320b5f72a0f4adf24b25 (diff) | |
merge branch lineage-20 into t13.0t13.0
https: //github.com/LineageOS/android_kernel_google_redbull
Change-Id: I4a450eb794cc99abf711ad3b5b82946092be84ba
Diffstat (limited to 'net/core/skbuff.c')
| -rw-r--r-- | net/core/skbuff.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 39d134a7955c..1768e0c56866 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -3563,23 +3563,25 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb, int pos; int dummy; - if (list_skb && !list_skb->head_frag && skb_headlen(list_skb) && - (skb_shinfo(head_skb)->gso_type & SKB_GSO_DODGY)) { - /* gso_size is untrusted, and we have a frag_list with a linear - * non head_frag head. - * - * (we assume checking the first list_skb member suffices; - * i.e if either of the list_skb members have non head_frag - * head, then the first one has too). - * - * If head_skb's headlen does not fit requested gso_size, it - * means that the frag_list members do NOT terminate on exact - * gso_size boundaries. Hence we cannot perform skb_frag_t page - * sharing. Therefore we must fallback to copying the frag_list - * skbs; we do so by disabling SG. - */ - if (mss != GSO_BY_FRAGS && mss != skb_headlen(head_skb)) - features &= ~NETIF_F_SG; + if ((skb_shinfo(head_skb)->gso_type & SKB_GSO_DODGY) && + mss != GSO_BY_FRAGS && mss != skb_headlen(head_skb)) { + struct sk_buff *check_skb; + + for (check_skb = list_skb; check_skb; check_skb = check_skb->next) { + if (skb_headlen(check_skb) && !check_skb->head_frag) { + /* gso_size is untrusted, and we have a frag_list with + * a linear non head_frag item. + * + * If head_skb's headlen does not fit requested gso_size, + * it means that the frag_list members do NOT terminate + * on exact gso_size boundaries. Hence we cannot perform + * skb_frag_t page sharing. Therefore we must fallback to + * copying the frag_list skbs; we do so by disabling SG. + */ + features &= ~NETIF_F_SG; + break; + } + } } __skb_push(head_skb, doffset); |
