irda: prevent integer underflow in IRLMP_ENUMDEVICES
Subsystems (2)
PATCH 1/1 irda: prevent integer underflow in IRLMP_ENUMDEVICES
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.
--- net/irda/af_irda.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-)
net/irda/af_irda.c +11 -7
@@ -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 ;
From: Dan Rosenberg <[email protected]>
Date: Wed, 22 Dec 2010 18:58:27 -0500
Quoted 7 lines
If the user-provided len is less than the expected offset, the
IRLMP_ENUMDEVICESgetsockopt will do acopy_to_user()with a very large size value. While this isn't be a security issue on x86 because it will get caught by theaccess_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 <[email protected]>
Applied, thanks.