Skip to content

Commit

Permalink
irda: small read past the end of array in debug code
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Dan Carpenter authored and davem330 committed Apr 19, 2013
1 parent fd7fc25 commit e15465e
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
3 changes: 2 additions & 1 deletion include/net/irda/irlmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,8 @@ static inline __u32 irlmp_get_daddr(const struct lsap_cb *self)
return (self && self->lap) ? self->lap->daddr : 0;
}

extern const char *irlmp_reasons[];
const char *irlmp_reason_str(LM_REASON reason);

extern int sysctl_discovery_timeout;
extern int sysctl_discovery_slots;
extern int sysctl_discovery;
Expand Down
3 changes: 2 additions & 1 deletion net/irda/iriap.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,8 @@ static void iriap_disconnect_indication(void *instance, void *sap,
{
struct iriap_cb *self;

IRDA_DEBUG(4, "%s(), reason=%s\n", __func__, irlmp_reasons[reason]);
IRDA_DEBUG(4, "%s(), reason=%s [%d]\n", __func__,
irlmp_reason_str(reason), reason);

self = instance;

Expand Down
10 changes: 9 additions & 1 deletion net/irda/irlmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,15 @@ const char *irlmp_reasons[] = {
"LM_LAP_RESET",
"LM_INIT_DISCONNECT",
"ERROR, NOT USED",
"UNKNOWN",
};

const char *irlmp_reason_str(LM_REASON reason)
{
reason = min_t(size_t, reason, ARRAY_SIZE(irlmp_reasons) - 1);
return irlmp_reasons[reason];
}

/*
* Function irlmp_init (void)
*
Expand Down Expand Up @@ -747,7 +754,8 @@ void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason,
{
struct lsap_cb *lsap;

IRDA_DEBUG(1, "%s(), reason=%s\n", __func__, irlmp_reasons[reason]);
IRDA_DEBUG(1, "%s(), reason=%s [%d]\n", __func__,
irlmp_reason_str(reason), reason);
IRDA_ASSERT(self != NULL, return;);
IRDA_ASSERT(self->magic == LMP_LSAP_MAGIC, return;);

Expand Down

0 comments on commit e15465e

Please sign in to comment.