diff options
Diffstat (limited to 'net/sctp/input.c')
-rw-r--r-- | net/sctp/input.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index c182db7d691f..69444d32ecda 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c | |||
@@ -119,7 +119,13 @@ int sctp_rcv(struct sk_buff *skb) | |||
119 | skb_transport_offset(skb)) | 119 | skb_transport_offset(skb)) |
120 | goto discard_it; | 120 | goto discard_it; |
121 | 121 | ||
122 | if (!pskb_may_pull(skb, sizeof(struct sctphdr))) | 122 | /* If the packet is fragmented and we need to do crc checking, |
123 | * it's better to just linearize it otherwise crc computing | ||
124 | * takes longer. | ||
125 | */ | ||
126 | if ((!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) && | ||
127 | skb_linearize(skb)) || | ||
128 | !pskb_may_pull(skb, sizeof(struct sctphdr))) | ||
123 | goto discard_it; | 129 | goto discard_it; |
124 | 130 | ||
125 | /* Pull up the IP header. */ | 131 | /* Pull up the IP header. */ |
@@ -1177,9 +1183,6 @@ static struct sctp_association *__sctp_rcv_lookup_harder(struct net *net, | |||
1177 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) | 1183 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP) |
1178 | return NULL; | 1184 | return NULL; |
1179 | 1185 | ||
1180 | if (skb_linearize(skb)) | ||
1181 | return NULL; | ||
1182 | |||
1183 | ch = (sctp_chunkhdr_t *) skb->data; | 1186 | ch = (sctp_chunkhdr_t *) skb->data; |
1184 | 1187 | ||
1185 | /* The code below will attempt to walk the chunk and extract | 1188 | /* The code below will attempt to walk the chunk and extract |