Patchwork [IrDA] : small read past the end of array in debug code

login
register
mail settings
Submitter Dan Carpenter
Date April 17, 2013, 7:10 a.m.
Message ID <20130417071038.GA7923@elgon.mountain>
Download mbox | patch
Permalink /patch/237155/
State Accepted
Delegated to: David Miller
Headers show

Comments

Dan Carpenter - April 17, 2013, 7:10 a.m.
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>

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - April 19, 2013, 9:33 p.m.
From: Dan Carpenter <dan.carpenter@oracle.com>
Date: Wed, 17 Apr 2013 10:10:38 +0300

> 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>

Applied but please put the subsystem prefix outside of [] which get
stripped by git am and other tools.  I fixed it up to be "irda: ".

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dan Carpenter - April 20, 2013, 8:39 p.m.
On Fri, Apr 19, 2013 at 05:33:29PM -0400, David Miller wrote:
> From: Dan Carpenter <dan.carpenter@oracle.com>
> Date: Wed, 17 Apr 2013 10:10:38 +0300
> 
> > 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>
> 
> Applied but please put the subsystem prefix outside of [] which get
> stripped by git am and other tools.  I fixed it up to be "irda: ".
> 

Sorry about that.  I won't do it again.

It's weird because the prefix was cut and pasted from an earlier
commit.  Also [media] and [SCSI] use square brackets in their
subsystems.  I tried some experiments with "git am" and you're right
that "git am" always strips out the square bracket stuff.  Odd.

regards,
dan carpenter

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ben Hutchings - April 22, 2013, 6:02 p.m.
On Sat, 2013-04-20 at 23:39 +0300, Dan Carpenter wrote:
> On Fri, Apr 19, 2013 at 05:33:29PM -0400, David Miller wrote:
> > From: Dan Carpenter <dan.carpenter@oracle.com>
> > Date: Wed, 17 Apr 2013 10:10:38 +0300
> > 
> > > 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>
> > 
> > Applied but please put the subsystem prefix outside of [] which get
> > stripped by git am and other tools.  I fixed it up to be "irda: ".
> > 
> 
> Sorry about that.  I won't do it again.
> 
> It's weird because the prefix was cut and pasted from an earlier
> commit.  Also [media] and [SCSI] use square brackets in their
> subsystems.  I tried some experiments with "git am" and you're right
> that "git am" always strips out the square bracket stuff.  Odd.

The -k option suppresses this behaviour, but then it will also keep
[PATCH].  It's a shame there's no option to strip just \[PATCH[^]]*\]

Ben.

Patch

diff --git a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h
index f741091..f132924 100644
--- a/include/net/irda/irlmp.h
+++ b/include/net/irda/irlmp.h
@@ -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;
diff --git a/net/irda/irlmp.c b/net/irda/irlmp.c
index 6115a44..1064621 100644
--- a/net/irda/irlmp.c
+++ b/net/irda/irlmp.c
@@ -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)
  *
@@ -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;);
 
diff --git a/net/irda/iriap.c b/net/irda/iriap.c
index 29340a9..e1b37f5 100644
--- a/net/irda/iriap.c
+++ b/net/irda/iriap.c
@@ -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;