X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Facpi%2Fsystem.c;h=f686992ebcec0e05d1826245706cbb2707a57c19;hb=28169de0a7d33c5a792a8a4be7f519c637099cea;hp=9919e76d7d49ccde3585b14a1263ec0d0e5b5758;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 9919e76d7..f686992eb 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c @@ -92,7 +92,8 @@ acpi_system_read_dsdt ( { acpi_status status = AE_OK; struct acpi_buffer dsdt = {ACPI_ALLOCATE_BUFFER, NULL}; - ssize_t res; + void *data = NULL; + size_t size = 0; ACPI_FUNCTION_TRACE("acpi_system_read_dsdt"); @@ -100,11 +101,22 @@ acpi_system_read_dsdt ( if (ACPI_FAILURE(status)) return_VALUE(-ENODEV); - res = simple_read_from_buffer(buffer, count, ppos, - dsdt.pointer, dsdt.length); + if (*ppos < dsdt.length) { + data = dsdt.pointer + file->f_pos; + size = dsdt.length - file->f_pos; + if (size > count) + size = count; + if (copy_to_user(buffer, data, size)) { + acpi_os_free(dsdt.pointer); + return_VALUE(-EFAULT); + } + } + acpi_os_free(dsdt.pointer); - return_VALUE(res); + *ppos += size; + + return_VALUE(size); } @@ -123,7 +135,8 @@ acpi_system_read_fadt ( { acpi_status status = AE_OK; struct acpi_buffer fadt = {ACPI_ALLOCATE_BUFFER, NULL}; - ssize_t res; + void *data = NULL; + size_t size = 0; ACPI_FUNCTION_TRACE("acpi_system_read_fadt"); @@ -131,11 +144,22 @@ acpi_system_read_fadt ( if (ACPI_FAILURE(status)) return_VALUE(-ENODEV); - res = simple_read_from_buffer(buffer, count, ppos, - fadt.pointer, fadt.length); + if (*ppos < fadt.length) { + data = fadt.pointer + file->f_pos; + size = fadt.length - file->f_pos; + if (size > count) + size = count; + if (copy_to_user(buffer, data, size)) { + acpi_os_free(fadt.pointer); + return_VALUE(-EFAULT); + } + } + acpi_os_free(fadt.pointer); - return_VALUE(res); + *ppos += size; + + return_VALUE(size); }