Commit def3074d authored by Len Brown's avatar Len Brown Committed by Len Brown

[ACPI] toshiba_acpi 0.18 from John Belmonte

  add missing copyin
parent 6f50ab9a
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* *
*/ */
#define TOSHIBA_ACPI_VERSION "0.17" #define TOSHIBA_ACPI_VERSION "0.18"
#define PROC_INTERFACE_VERSION 1 #define PROC_INTERFACE_VERSION 1
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <acpi/acpi_drivers.h> #include <acpi/acpi_drivers.h>
...@@ -105,24 +106,6 @@ _set_bit(u32* word, u32 mask, int value) ...@@ -105,24 +106,6 @@ _set_bit(u32* word, u32 mask, int value)
*word = (*word & ~mask) | (mask * value); *word = (*word & ~mask) | (mask * value);
} }
/* an sscanf that takes explicit string length */
static int
snscanf(const char* str, int n, const char* format, ...)
{
va_list args;
int result;
char* str2 = kmalloc(n + 1, GFP_KERNEL);
if (str2 == 0) return 0;
/* NOTE: don't even _think_ about replacing this with strlcpy */
strncpy(str2, str, n);
str2[n] = 0;
va_start(args, format);
result = vsscanf(str2, format, args);
va_end(args);
kfree(str2);
return result;
}
/* acpi interface wrappers /* acpi interface wrappers
*/ */
...@@ -269,10 +252,26 @@ dispatch_read(char* page, char** start, off_t off, int count, int* eof, ...@@ -269,10 +252,26 @@ dispatch_read(char* page, char** start, off_t off, int count, int* eof,
} }
static int static int
dispatch_write(struct file* file, const char* buffer, unsigned long count, dispatch_write(struct file* file, __user const char* buffer,
ProcItem* item) unsigned long count, ProcItem* item)
{ {
return item->write_func(buffer, count); int result;
char* tmp_buffer;
/* Arg buffer points to userspace memory, which can't be accessed
* directly. Since we're making a copy, zero-terminate the
* destination so that sscanf can be used on it safely.
*/
tmp_buffer = kmalloc(count + 1, GFP_KERNEL);
if (copy_from_user(tmp_buffer, buffer, count)) {
result = -EFAULT;
}
else {
tmp_buffer[count] = 0;
result = item->write_func(tmp_buffer, count);
}
kfree(tmp_buffer);
return result;
} }
static char* static char*
...@@ -300,7 +299,7 @@ write_lcd(const char* buffer, unsigned long count) ...@@ -300,7 +299,7 @@ write_lcd(const char* buffer, unsigned long count)
int value; int value;
u32 hci_result; u32 hci_result;
if (snscanf(buffer, count, " brightness : %i", &value) == 1 && if (sscanf(buffer, " brightness : %i", &value) == 1 &&
value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) { value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) {
value = value << HCI_LCD_BRIGHTNESS_SHIFT; value = value << HCI_LCD_BRIGHTNESS_SHIFT;
hci_write1(HCI_LCD_BRIGHTNESS, value, &hci_result); hci_write1(HCI_LCD_BRIGHTNESS, value, &hci_result);
...@@ -350,11 +349,11 @@ write_video(const char* buffer, unsigned long count) ...@@ -350,11 +349,11 @@ write_video(const char* buffer, unsigned long count)
* NOTE: to keep scanning simple, invalid fields are ignored * NOTE: to keep scanning simple, invalid fields are ignored
*/ */
while (remain) { while (remain) {
if (snscanf(buffer, remain, " lcd_out : %i", &value) == 1) if (sscanf(buffer, " lcd_out : %i", &value) == 1)
lcd_out = value & 1; lcd_out = value & 1;
else if (snscanf(buffer, remain, " crt_out : %i", &value) == 1) else if (sscanf(buffer, " crt_out : %i", &value) == 1)
crt_out = value & 1; crt_out = value & 1;
else if (snscanf(buffer, remain, " tv_out : %i", &value) == 1) else if (sscanf(buffer, " tv_out : %i", &value) == 1)
tv_out = value & 1; tv_out = value & 1;
/* advance to one character past the next ; */ /* advance to one character past the next ; */
do { do {
...@@ -407,7 +406,7 @@ write_fan(const char* buffer, unsigned long count) ...@@ -407,7 +406,7 @@ write_fan(const char* buffer, unsigned long count)
int value; int value;
u32 hci_result; u32 hci_result;
if (snscanf(buffer, count, " force_on : %i", &value) == 1 && if (sscanf(buffer, " force_on : %i", &value) == 1 &&
value >= 0 && value <= 1) { value >= 0 && value <= 1) {
hci_write1(HCI_FAN, value, &hci_result); hci_write1(HCI_FAN, value, &hci_result);
if (hci_result != HCI_SUCCESS) if (hci_result != HCI_SUCCESS)
...@@ -458,7 +457,7 @@ write_keys(const char* buffer, unsigned long count) ...@@ -458,7 +457,7 @@ write_keys(const char* buffer, unsigned long count)
{ {
int value; int value;
if (snscanf(buffer, count, " hotkey_ready : %i", &value) == 1 && if (sscanf(buffer, " hotkey_ready : %i", &value) == 1 &&
value == 0) { value == 0) {
key_event_valid = 0; key_event_valid = 0;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment