--- a/drivers/acpi/asus_acpi.c 2004-02-18 14:36:31.000000000 +0100 +++ b/drivers/acpi/asus_acpi.c 2004-03-23 16:41:48.000000000 +0100 @@ -40,6 +40,7 @@ #include #include #include +#include #define ASUS_ACPI_VERSION "0.27" @@ -499,9 +500,16 @@ write_led(const char *buffer, unsigned l { int value; int led_out = 0; + char *tmp_buffer; - if (sscanf(buffer, "%i", &value) == 1) + tmp_buffer = kmalloc(count + 1, GFP_KERNEL); + if (copy_from_user(tmp_buffer, buffer, count)) + return -EFAULT; + else + tmp_buffer[count] = '\0'; + if (sscanf(tmp_buffer, "%i", &value) == 1) led_out = value ? 1 : 0; + kfree(tmp_buffer); hotk->status = (led_out) ? (hotk->status | ledmask) : (hotk->status & ~ledmask); @@ -656,9 +664,17 @@ proc_write_lcd(struct file *file, const { int value; struct asus_hotk *hotk = (struct asus_hotk *) data; + char *tmp_buffer; - if (sscanf(buffer, "%i", &value) == 1) + tmp_buffer = kmalloc(count + 1, GFP_KERNEL); + if (copy_from_user(tmp_buffer, buffer, count)) + return -EFAULT; + else + tmp_buffer[count] = '\0'; + if (sscanf(tmp_buffer, "%i", &value) == 1) set_lcd_state(hotk, value); + kfree(tmp_buffer); + return count; } @@ -723,14 +739,21 @@ proc_write_brn(struct file *file, const { int value; struct asus_hotk *hotk = (struct asus_hotk *) data; + char *tmp_buffer; - if (sscanf(buffer, "%d", &value) == 1) { + tmp_buffer = kmalloc(count + 1, GFP_KERNEL); + if (copy_from_user(tmp_buffer, buffer, count)) + return -EFAULT; + else + tmp_buffer[count] = '\0'; + if (sscanf(tmp_buffer, "%d", &value) == 1) { value = (0 < value) ? ((15 < value) ? 15 : value) : 0; /* 0 <= value <= 15 */ set_brightness(value, hotk); } else { printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } + kfree(tmp_buffer); return count; } @@ -772,12 +795,19 @@ proc_write_disp(struct file *file, const { int value; struct asus_hotk *hotk = (struct asus_hotk *) data; + char *tmp_buffer; - if (sscanf(buffer, "%d", &value) == 1) + tmp_buffer = kmalloc(count + 1, GFP_KERNEL); + if (copy_from_user(tmp_buffer, buffer, count)) + return -EFAULT; + else + tmp_buffer[count] = '\0'; + if (sscanf(tmp_buffer, "%d", &value) == 1) set_display(value, hotk); else { printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } + kfree(tmp_buffer); return count; }