diff options
| author | Dan Carpenter <dan.carpenter@oracle.com> | 2013-04-16 17:10:38 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-04-19 17:32:31 -0400 |
| commit | e15465e1808542743627f13d1c0cbb7eacc82b83 (patch) | |
| tree | 498799f640d53224044d5cdcb0463a162d7744a2 /net/irda | |
| parent | fd7fc253289c419615c1c8bbe418598019567392 (diff) | |
irda: small read past the end of array in debug code
The "reason" can come from skb->data[] and it hasn't been capped so it
can be from 0-255 instead of just 0-6. For example in irlmp_state_dtr()
the code does:
reason = skb->data[3];
...
irlmp_disconnect_indication(self, reason, skb);
Also LMREASON has a couple other values which don't have entries in the
irlmp_reasons[] array. And 0xff is a valid reason as well which means
"unknown".
So far as I can see we don't actually care about "reason" except for in
the debug code.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/irda')
| -rw-r--r-- | net/irda/iriap.c | 3 | ||||
| -rw-r--r-- | net/irda/irlmp.c | 10 |
2 files changed, 11 insertions, 2 deletions
diff --git a/net/irda/iriap.c b/net/irda/iriap.c index 29340a9a6fb9..e1b37f5a2691 100644 --- a/net/irda/iriap.c +++ b/net/irda/iriap.c | |||
| @@ -303,7 +303,8 @@ static void iriap_disconnect_indication(void *instance, void *sap, | |||
| 303 | { | 303 | { |
| 304 | struct iriap_cb *self; | 304 | struct iriap_cb *self; |
| 305 | 305 | ||
| 306 | IRDA_DEBUG(4, "%s(), reason=%s\n", __func__, irlmp_reasons[reason]); | 306 | IRDA_DEBUG(4, "%s(), reason=%s [%d]\n", __func__, |
| 307 | irlmp_reason_str(reason), reason); | ||
| 307 | 308 | ||
| 308 | self = instance; | 309 | self = instance; |
| 309 | 310 | ||
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c index 6115a44c0a24..1064621da6f6 100644 --- a/net/irda/irlmp.c +++ b/net/irda/irlmp.c | |||
| @@ -66,8 +66,15 @@ const char *irlmp_reasons[] = { | |||
| 66 | "LM_LAP_RESET", | 66 | "LM_LAP_RESET", |
| 67 | "LM_INIT_DISCONNECT", | 67 | "LM_INIT_DISCONNECT", |
| 68 | "ERROR, NOT USED", | 68 | "ERROR, NOT USED", |
| 69 | "UNKNOWN", | ||
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 72 | const char *irlmp_reason_str(LM_REASON reason) | ||
| 73 | { | ||
| 74 | reason = min_t(size_t, reason, ARRAY_SIZE(irlmp_reasons) - 1); | ||
| 75 | return irlmp_reasons[reason]; | ||
| 76 | } | ||
| 77 | |||
| 71 | /* | 78 | /* |
| 72 | * Function irlmp_init (void) | 79 | * Function irlmp_init (void) |
| 73 | * | 80 | * |
| @@ -747,7 +754,8 @@ void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason, | |||
| 747 | { | 754 | { |
| 748 | struct lsap_cb *lsap; | 755 | struct lsap_cb *lsap; |
| 749 | 756 | ||
| 750 | IRDA_DEBUG(1, "%s(), reason=%s\n", __func__, irlmp_reasons[reason]); | 757 | IRDA_DEBUG(1, "%s(), reason=%s [%d]\n", __func__, |
| 758 | irlmp_reason_str(reason), reason); | ||
| 751 | IRDA_ASSERT(self != NULL, return;); | 759 | IRDA_ASSERT(self != NULL, return;); |
| 752 | IRDA_ASSERT(self->magic == LMP_LSAP_MAGIC, return;); | 760 | IRDA_ASSERT(self->magic == LMP_LSAP_MAGIC, return;); |
| 753 | 761 | ||
