diff options
-rw-r--r-- | net/irda/ircomm/ircomm_core.c | 12 | ||||
-rw-r--r-- | net/irda/irlap_event.c | 13 |
2 files changed, 25 insertions, 0 deletions
diff --git a/net/irda/ircomm/ircomm_core.c b/net/irda/ircomm/ircomm_core.c index 2d63fa8e1556..b825399fc160 100644 --- a/net/irda/ircomm/ircomm_core.c +++ b/net/irda/ircomm/ircomm_core.c | |||
@@ -363,6 +363,18 @@ void ircomm_process_data(struct ircomm_cb *self, struct sk_buff *skb) | |||
363 | clen = skb->data[0]; | 363 | clen = skb->data[0]; |
364 | 364 | ||
365 | /* | 365 | /* |
366 | * Input validation check: a stir4200/mcp2150 combinations sometimes | ||
367 | * results in frames with clen > remaining packet size. These are | ||
368 | * illegal; if we throw away just this frame then it seems to carry on | ||
369 | * fine | ||
370 | */ | ||
371 | if (unlikely(skb->len < (clen + 1))) { | ||
372 | IRDA_DEBUG(2, "%s() throwing away illegal frame\n", | ||
373 | __FUNCTION__ ); | ||
374 | return; | ||
375 | } | ||
376 | |||
377 | /* | ||
366 | * If there are any data hiding in the control channel, we must | 378 | * If there are any data hiding in the control channel, we must |
367 | * deliver it first. The side effect is that the control channel | 379 | * deliver it first. The side effect is that the control channel |
368 | * will be removed from the skb | 380 | * will be removed from the skb |
diff --git a/net/irda/irlap_event.c b/net/irda/irlap_event.c index 6d3aff862dc2..6af86eba7463 100644 --- a/net/irda/irlap_event.c +++ b/net/irda/irlap_event.c | |||
@@ -1199,6 +1199,19 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event, | |||
1199 | 1199 | ||
1200 | switch (event) { | 1200 | switch (event) { |
1201 | case RECV_I_RSP: /* Optimize for the common case */ | 1201 | case RECV_I_RSP: /* Optimize for the common case */ |
1202 | if (unlikely(skb->len <= LAP_ADDR_HEADER + LAP_CTRL_HEADER)) { | ||
1203 | /* | ||
1204 | * Input validation check: a stir4200/mcp2150 | ||
1205 | * combination sometimes results in an empty i:rsp. | ||
1206 | * This makes no sense; we can just ignore the frame | ||
1207 | * and send an rr:cmd immediately. This happens before | ||
1208 | * changing nr or ns so triggers a retransmit | ||
1209 | */ | ||
1210 | irlap_wait_min_turn_around(self, &self->qos_tx); | ||
1211 | irlap_send_rr_frame(self, CMD_FRAME); | ||
1212 | /* Keep state */ | ||
1213 | break; | ||
1214 | } | ||
1202 | /* FIXME: must check for remote_busy below */ | 1215 | /* FIXME: must check for remote_busy below */ |
1203 | #ifdef CONFIG_IRDA_FAST_RR | 1216 | #ifdef CONFIG_IRDA_FAST_RR |
1204 | /* | 1217 | /* |