diff options
author | khali@linux-fr.org <khali@linux-fr.org> | 2005-04-29 18:00:04 -0700 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-05-12 10:00:21 -0700 |
commit | 64ffae4fd89885a42a39ce91348e008a9f92166a (patch) | |
tree | f5c1038b3f4f240c654fefdf8ebda36b14fd6871 | |
parent | 0c726347c8ae1a81d1461e9c02ca45f5629f4714 (diff) | |
download | linux-stable-64ffae4fd89885a42a39ce91348e008a9f92166a.tar.gz linux-stable-64ffae4fd89885a42a39ce91348e008a9f92166a.tar.bz2 linux-stable-64ffae4fd89885a42a39ce91348e008a9f92166a.zip |
[PATCH] I2C: Fix incorrect sysfs file permissions in it87 and via686a drivers
The it87 and via686a hardware monitoring drivers each create a sysfs
file named "alarms" in R/W mode, while they should really create it in
read-only mode. Since we don't provide a store function for these files,
write attempts to these files will do something undefined (I guess) and
bad (I am sure). My own try resulted in a locked terminal (where I
attempted the write) and a 100% CPU load until next reboot.
As a side note, wouldn't it make sense to check, when creating sysfs
files, that readable files have a non-NULL show method, and writable
files have a non-NULL store method? I know drivers are not supposed to
do stupid things, but there is already a BUG_ON for several conditions
in sysfs_create_file, so maybe we could add two more?
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/i2c/chips/it87.c | 2 | ||||
-rw-r--r-- | drivers/i2c/chips/via686a.c | 2 | ||||
-rw-r--r-- | fs/partitions/msdos.c | 5 |
3 files changed, 7 insertions, 2 deletions
diff --git a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c index 8988f4fa9169..bf91307a0bb2 100644 --- a/drivers/i2c/chips/it87.c +++ b/drivers/i2c/chips/it87.c @@ -631,7 +631,7 @@ static ssize_t show_alarms(struct device *dev, char *buf) struct it87_data *data = it87_update_device(dev); return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms)); } -static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL); +static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); static ssize_t show_vrm_reg(struct device *dev, char *buf) diff --git a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c index cacc2578fa04..a49dc222b721 100644 --- a/drivers/i2c/chips/via686a.c +++ b/drivers/i2c/chips/via686a.c @@ -554,7 +554,7 @@ static ssize_t show_alarms(struct device *dev, char *buf) { struct via686a_data *data = via686a_update_device(dev); return sprintf(buf,"%d\n", ALARMS_FROM_REG(data->alarms)); } -static DEVICE_ATTR(alarms, S_IRUGO | S_IWUSR, show_alarms, NULL); +static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); /* The driver. I choose to use type i2c_driver, as at is identical to both smbus_driver and isa_driver, and clients could be of either kind */ diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c index 584a27b2bbd5..17ee1b4ff087 100644 --- a/fs/partitions/msdos.c +++ b/fs/partitions/msdos.c @@ -114,6 +114,9 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev, */ for (i=0; i<4; i++, p++) { u32 offs, size, next; + + if (SYS_IND(p) == 0) + continue; if (!NR_SECTS(p) || is_extended_partition(p)) continue; @@ -430,6 +433,8 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev) for (slot = 1 ; slot <= 4 ; slot++, p++) { u32 start = START_SECT(p)*sector_size; u32 size = NR_SECTS(p)*sector_size; + if (SYS_IND(p) == 0) + continue; if (!size) continue; if (is_extended_partition(p)) { |