svn commit: r218685 - head/sys/dev/acpica
Jung-uk Kim
jkim at FreeBSD.org
Mon Feb 14 17:52:25 UTC 2011
On Monday 14 February 2011 12:20 pm, Matthew D Fleming wrote:
> Author: mdf
> Date: Mon Feb 14 17:20:20 2011
> New Revision: 218685
> URL: http://svn.freebsd.org/changeset/base/218685
>
> Log:
> Prevent reading from the ACPI_RESOURCE past its actual end. For
> paranoia limit to the size of the ACPI_RESOURCE as well.
>
> Reviewd by: jhb (in spirit)
> MFC after: 1 week
>
> Modified:
> head/sys/dev/acpica/acpi_resource.c
>
> Modified: head/sys/dev/acpica/acpi_resource.c
> ===================================================================
>=========== --- head/sys/dev/acpica/acpi_resource.c Mon Feb 14
> 16:54:03 2011 (r218684) +++ head/sys/dev/acpica/acpi_resource.c Mon
> Feb 14 17:20:20 2011 (r218685) @@ -60,6 +60,7 @@ static ACPI_STATUS
> acpi_lookup_irq_handler(ACPI_RESOURCE *res, void *context)
> {
> struct lookup_irq_request *req;
> + size_t len;
> u_int irqnum, irq;
>
> switch (res->Type) {
> @@ -82,7 +83,10 @@ acpi_lookup_irq_handler(ACPI_RESOURCE *r
> req->found = 1;
> KASSERT(irq == rman_get_start(req->res),
> ("IRQ resources do not match"));
> - bcopy(res, req->acpi_res, sizeof(ACPI_RESOURCE));
> + len = res->Length;
> + if (len > sizeof(ACPI_RESOURCE))
> + len = sizeof(ACPI_RESOURCE);
> + bcopy(res, req->acpi_res, len);
> return (AE_CTRL_TERMINATE);
> }
> return (AE_OK);
Hmm... I am not sure this is a correct fix. For most cases, directly
using sizeof(ACPI_RESOURCE) is evil as it does not reflect actual
size of underlying structure. With the same reason,
sizeof(ACPI_RESOURCE_IRQ) and sizeof(ACPI_RESOURCE_EXTENDED_IRQ) is
not recommended, either. A correct fix is to extend
acpi_lookup_irq_resource() to allocate necessary space dynamically.
Jung-uk Kim
More information about the svn-src-all
mailing list