|
Line 0
Link Here
|
|
|
1 |
--- acpi_call.c.orig 2011-11-07 05:35:10 UTC |
| 2 |
+++ acpi_call.c |
| 3 |
@@ -43,12 +43,13 @@ |
| 4 |
#include "acpi_call_io.h" |
| 5 |
|
| 6 |
|
| 7 |
-void acpi_call_fixup_pointers(ACPI_OBJECT *p, UINT8 *orig); |
| 8 |
+void acpi_call_fixup_pointers(ACPI_OBJECT *p, UINT8 *user, size_t len); |
| 9 |
|
| 10 |
static int |
| 11 |
acpi_call_ioctl(u_long cmd, caddr_t addr, void *arg) |
| 12 |
{ |
| 13 |
struct acpi_call_descr *params; |
| 14 |
+ char path[MAX_ACPI_PATH + 1]; |
| 15 |
ACPI_BUFFER result; |
| 16 |
|
| 17 |
result.Length = ACPI_ALLOCATE_BUFFER; |
| 18 |
@@ -56,19 +57,24 @@ acpi_call_ioctl(u_long cmd, caddr_t addr, void *arg) |
| 19 |
|
| 20 |
if (cmd == ACPIIO_CALL) { |
| 21 |
params = (struct acpi_call_descr*)addr; |
| 22 |
- params->retval = AcpiEvaluateObject(NULL, params->path, ¶ms->args, &result); |
| 23 |
+ copyin(params->path, path, params->path_len); |
| 24 |
+ path[params->path_len] = '\0'; |
| 25 |
+ params->retval = AcpiEvaluateObject(NULL, path, ¶ms->args, &result); |
| 26 |
if (ACPI_SUCCESS(params->retval)) |
| 27 |
{ |
| 28 |
if (result.Pointer != NULL) |
| 29 |
{ |
| 30 |
if (params->result.Pointer != NULL) |
| 31 |
{ |
| 32 |
+ if (params->result.Length < sizeof(ACPI_OBJECT)) { |
| 33 |
+ AcpiOsFree(result.Pointer); |
| 34 |
+ return (EINVAL); |
| 35 |
+ } |
| 36 |
params->result.Length = min(params->result.Length, result.Length); |
| 37 |
+ acpi_call_fixup_pointers((ACPI_OBJECT*)(result.Pointer), params->result.Pointer, result.Length); |
| 38 |
copyout(result.Pointer, params->result.Pointer, |
| 39 |
params->result.Length); |
| 40 |
params->reslen = result.Length; |
| 41 |
- if (result.Length >= sizeof(ACPI_OBJECT)) |
| 42 |
- acpi_call_fixup_pointers((ACPI_OBJECT*)(params->result.Pointer), result.Pointer); |
| 43 |
} |
| 44 |
AcpiOsFree(result.Pointer); |
| 45 |
} |
| 46 |
@@ -79,16 +85,24 @@ acpi_call_ioctl(u_long cmd, caddr_t addr, void *arg) |
| 47 |
} |
| 48 |
|
| 49 |
void |
| 50 |
-acpi_call_fixup_pointers(ACPI_OBJECT *p, UINT8 *orig) |
| 51 |
+acpi_call_fixup_pointers(ACPI_OBJECT *p, UINT8 *user, size_t len) |
| 52 |
{ |
| 53 |
switch (p->Type) |
| 54 |
{ |
| 55 |
case ACPI_TYPE_STRING: |
| 56 |
- p->String.Pointer = (char*)((UINT8*)(p->String.Pointer) - orig + (UINT8*)p); |
| 57 |
- break; |
| 58 |
+ if ((char *)(p->String.Pointer + p->String.Length/sizeof(*p->String.Pointer)) <= (char *)p + len) { |
| 59 |
+ p->String.Pointer = user + ( (char *)p->String.Pointer - (char *)p ); |
| 60 |
+ return; |
| 61 |
+ } |
| 62 |
+ p->String.Pointer = NULL; |
| 63 |
+ return; |
| 64 |
case ACPI_TYPE_BUFFER: |
| 65 |
- p->Buffer.Pointer -= orig - (UINT8*)p; |
| 66 |
- break; |
| 67 |
+ if ((char *)(p->Buffer.Pointer + p->Buffer.Length/sizeof(*p->Buffer.Pointer)) <= (char *)p + len) { |
| 68 |
+ p->Buffer.Pointer = user + ( (char *)p->Buffer.Pointer - (char *)p ); |
| 69 |
+ return; |
| 70 |
+ } |
| 71 |
+ p->Buffer.Pointer = NULL; |
| 72 |
+ return; |
| 73 |
} |
| 74 |
} |
| 75 |
|