diff options
Diffstat (limited to 'drivers/acpi/ec_sys.c')
| -rw-r--r-- | drivers/acpi/ec_sys.c | 37 | 
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c index 411620ef84c..b4c216bab22 100644 --- a/drivers/acpi/ec_sys.c +++ b/drivers/acpi/ec_sys.c @@ -11,6 +11,8 @@  #include <linux/kernel.h>  #include <linux/acpi.h>  #include <linux/debugfs.h> +#include <linux/module.h> +#include <linux/uaccess.h>  #include "internal.h"  MODULE_AUTHOR("Thomas Renninger <trenn@suse.de>"); @@ -24,18 +26,8 @@ MODULE_PARM_DESC(write_support, "Dangerous, reboot and removal of battery may "  #define EC_SPACE_SIZE 256 -struct sysdev_class acpi_ec_sysdev_class = { -	.name = "ec", -}; -  static struct dentry *acpi_ec_debugfs_dir; -static int acpi_ec_open_io(struct inode *i, struct file *f) -{ -	f->private_data = i->i_private; -	return 0; -} -  static ssize_t acpi_ec_read_io(struct file *f, char __user *buf,  			       size_t count, loff_t *off)  { @@ -43,7 +35,6 @@ static ssize_t acpi_ec_read_io(struct file *f, char __user *buf,  	 * struct acpi_ec *ec = ((struct seq_file *)f->private_data)->private;  	 */  	unsigned int size = EC_SPACE_SIZE; -	u8 *data = (u8 *) buf;  	loff_t init_off = *off;  	int err = 0; @@ -56,9 +47,15 @@ static ssize_t acpi_ec_read_io(struct file *f, char __user *buf,  		size = count;  	while (size) { -		err = ec_read(*off, &data[*off - init_off]); +		u8 byte_read; +		err = ec_read(*off, &byte_read);  		if (err)  			return err; +		if (put_user(byte_read, buf + *off - init_off)) { +			if (*off - init_off) +				return *off - init_off; /* partial read */ +			return -EFAULT; +		}  		*off += 1;  		size--;  	} @@ -74,7 +71,6 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf,  	unsigned int size = count;  	loff_t init_off = *off; -	u8 *data = (u8 *) buf;  	int err = 0;  	if (*off >= EC_SPACE_SIZE) @@ -85,7 +81,12 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf,  	}  	while (size) { -		u8 byte_write = data[*off - init_off]; +		u8 byte_write; +		if (get_user(byte_write, buf + *off - init_off)) { +			if (*off - init_off) +				return *off - init_off; /* partial write */ +			return -EFAULT; +		}  		err = ec_write(*off, byte_write);  		if (err)  			return err; @@ -96,19 +97,19 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf,  	return count;  } -static struct file_operations acpi_ec_io_ops = { +static const struct file_operations acpi_ec_io_ops = {  	.owner = THIS_MODULE, -	.open  = acpi_ec_open_io, +	.open  = simple_open,  	.read  = acpi_ec_read_io,  	.write = acpi_ec_write_io,  	.llseek = default_llseek,  }; -int acpi_ec_add_debugfs(struct acpi_ec *ec, unsigned int ec_device_count) +static int acpi_ec_add_debugfs(struct acpi_ec *ec, unsigned int ec_device_count)  {  	struct dentry *dev_dir;  	char name[64]; -	mode_t mode = 0400; +	umode_t mode = 0400;  	if (ec_device_count == 0) {  		acpi_ec_debugfs_dir = debugfs_create_dir("ec", NULL);  | 
