diff options
Diffstat (limited to 'net/appletalk')
-rw-r--r-- | net/appletalk/ddp.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 16eda21fb38c..f6a92a0b7aa6 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -937,11 +937,11 @@ static unsigned long atalk_sum_partial(const unsigned char *data, | |||
937 | static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset, | 937 | static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset, |
938 | int len, unsigned long sum) | 938 | int len, unsigned long sum) |
939 | { | 939 | { |
940 | int end = skb_headlen(skb); | 940 | int start = skb_headlen(skb); |
941 | int i, copy; | 941 | int i, copy; |
942 | 942 | ||
943 | /* checksum stuff in header space */ | 943 | /* checksum stuff in header space */ |
944 | if ((copy = end - offset) > 0) { | 944 | if ( (copy = start - offset) > 0) { |
945 | if (copy > len) | 945 | if (copy > len) |
946 | copy = len; | 946 | copy = len; |
947 | sum = atalk_sum_partial(skb->data + offset, copy, sum); | 947 | sum = atalk_sum_partial(skb->data + offset, copy, sum); |
@@ -953,9 +953,11 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset, | |||
953 | 953 | ||
954 | /* checksum stuff in frags */ | 954 | /* checksum stuff in frags */ |
955 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 955 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
956 | BUG_TRAP(len >= 0); | 956 | int end; |
957 | 957 | ||
958 | end = offset + skb_shinfo(skb)->frags[i].size; | 958 | BUG_TRAP(start <= offset + len); |
959 | |||
960 | end = start + skb_shinfo(skb)->frags[i].size; | ||
959 | if ((copy = end - offset) > 0) { | 961 | if ((copy = end - offset) > 0) { |
960 | u8 *vaddr; | 962 | u8 *vaddr; |
961 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 963 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
@@ -963,31 +965,36 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset, | |||
963 | if (copy > len) | 965 | if (copy > len) |
964 | copy = len; | 966 | copy = len; |
965 | vaddr = kmap_skb_frag(frag); | 967 | vaddr = kmap_skb_frag(frag); |
966 | sum = atalk_sum_partial(vaddr + frag->page_offset, | 968 | sum = atalk_sum_partial(vaddr + frag->page_offset + |
967 | copy, sum); | 969 | offset - start, copy, sum); |
968 | kunmap_skb_frag(vaddr); | 970 | kunmap_skb_frag(vaddr); |
969 | 971 | ||
970 | if (!(len -= copy)) | 972 | if (!(len -= copy)) |
971 | return sum; | 973 | return sum; |
972 | offset += copy; | 974 | offset += copy; |
973 | } | 975 | } |
976 | start = end; | ||
974 | } | 977 | } |
975 | 978 | ||
976 | if (skb_shinfo(skb)->frag_list) { | 979 | if (skb_shinfo(skb)->frag_list) { |
977 | struct sk_buff *list = skb_shinfo(skb)->frag_list; | 980 | struct sk_buff *list = skb_shinfo(skb)->frag_list; |
978 | 981 | ||
979 | for (; list; list = list->next) { | 982 | for (; list; list = list->next) { |
980 | BUG_TRAP(len >= 0); | 983 | int end; |
984 | |||
985 | BUG_TRAP(start <= offset + len); | ||
981 | 986 | ||
982 | end = offset + list->len; | 987 | end = start + list->len; |
983 | if ((copy = end - offset) > 0) { | 988 | if ((copy = end - offset) > 0) { |
984 | if (copy > len) | 989 | if (copy > len) |
985 | copy = len; | 990 | copy = len; |
986 | sum = atalk_sum_skb(list, 0, copy, sum); | 991 | sum = atalk_sum_skb(list, offset - start, |
992 | copy, sum); | ||
987 | if ((len -= copy) == 0) | 993 | if ((len -= copy) == 0) |
988 | return sum; | 994 | return sum; |
989 | offset += copy; | 995 | offset += copy; |
990 | } | 996 | } |
997 | start = end; | ||
991 | } | 998 | } |
992 | } | 999 | } |
993 | 1000 | ||