* [PATCH] irda: prevent integer underflow in IRLMP_ENUMDEVICES
@ 2010-12-22 23:58 Dan Rosenberg
2010-12-23 18:09 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: Dan Rosenberg @ 2010-12-22 23:58 UTC (permalink / raw)
To: samuel, davem; +Cc: netdev, security
If the user-provided len is less than the expected offset, the
IRLMP_ENUMDEVICES getsockopt will do a copy_to_user() with a very large
size value. While this isn't be a security issue on x86 because it will
get caught by the access_ok() check, it may leak large amounts of kernel
heap on other architectures. In any event, this patch fixes it.
Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
Cc: stable <stable@kernel.org>
---
net/irda/af_irda.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
index a6de305..241d7a0 100644
--- a/net/irda/af_irda.c
+++ b/net/irda/af_irda.c
@@ -2280,6 +2280,16 @@ static int irda_getsockopt(struct socket *sock, int level, int optname,
switch (optname) {
case IRLMP_ENUMDEVICES:
+
+ /* Offset to first device entry */
+ offset = sizeof(struct irda_device_list) -
+ sizeof(struct irda_device_info);
+
+ if (len < offset) {
+ err = -EINVAL;
+ goto out;
+ }
+
/* Ask lmp for the current discovery log */
discoveries = irlmp_get_discoveries(&list.len, self->mask.word,
self->nslots);
@@ -2290,15 +2300,9 @@ static int irda_getsockopt(struct socket *sock, int level, int optname,
}
/* Write total list length back to client */
- if (copy_to_user(optval, &list,
- sizeof(struct irda_device_list) -
- sizeof(struct irda_device_info)))
+ if (copy_to_user(optval, &list, offset))
err = -EFAULT;
- /* Offset to first device entry */
- offset = sizeof(struct irda_device_list) -
- sizeof(struct irda_device_info);
-
/* Copy the list itself - watch for overflow */
if (list.len > 2048) {
err = -EINVAL;
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] irda: prevent integer underflow in IRLMP_ENUMDEVICES
2010-12-22 23:58 [PATCH] irda: prevent integer underflow in IRLMP_ENUMDEVICES Dan Rosenberg
@ 2010-12-23 18:09 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2010-12-23 18:09 UTC (permalink / raw)
To: drosenberg; +Cc: samuel, netdev, security
From: Dan Rosenberg <drosenberg@vsecurity.com>
Date: Wed, 22 Dec 2010 18:58:27 -0500
> If the user-provided len is less than the expected offset, the
> IRLMP_ENUMDEVICES getsockopt will do a copy_to_user() with a very large
> size value. While this isn't be a security issue on x86 because it will
> get caught by the access_ok() check, it may leak large amounts of kernel
> heap on other architectures. In any event, this patch fixes it.
>
> Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
Applied, thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-12-23 18:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-22 23:58 [PATCH] irda: prevent integer underflow in IRLMP_ENUMDEVICES Dan Rosenberg
2010-12-23 18:09 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).