From: Neil Horman Date: Tue, 21 Jul 2015 13:55:38 +0000 (-0400) Subject: staging: unisys: Linarize skbs X-Git-Tag: v4.14-rc1~4839^2~499 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=513e1cbda230c626bc01492f440805c4a88632d7;p=platform%2Fkernel%2Flinux-rpi.git staging: unisys: Linarize skbs If we can't fit an skb into a frag array, linaraize it so we don't have to Signed-off-by: Neil Horman Signed-off-by: Benjamin Romer Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c index f736392..a421a5b 100644 --- a/drivers/staging/unisys/visornic/visornic_main.c +++ b/drivers/staging/unisys/visornic/visornic_main.c @@ -221,9 +221,25 @@ visor_copy_fragsinfo_from_skb(struct sk_buff *skb, unsigned int firstfraglen, struct phys_info frags[]) { unsigned int count = 0, ii, size, offset = 0, numfrags; + unsigned int total_count; numfrags = skb_shinfo(skb)->nr_frags; + /* + * Compute the number of fragments this skb has, and if its more than + * frag array can hold, linearize the skb + */ + total_count = numfrags + (firstfraglen / PI_PAGE_SIZE); + if (firstfraglen % PI_PAGE_SIZE) + total_count++; + + if (total_count > frags_max) { + if (skb_linearize(skb)) + return -EINVAL; + numfrags = skb_shinfo(skb)->nr_frags; + firstfraglen = 0; + } + while (firstfraglen) { if (count == frags_max) return -EINVAL;