]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
[PATCH] I2C: Fix incorrect sysfs file permissions in it87 and via686a drivers
authorkhali@linux-fr.org <khali@linux-fr.org>
Sat, 30 Apr 2005 01:00:04 +0000 (18:00 -0700)
committerGreg KH <gregkh@suse.de>
Thu, 12 May 2005 17:00:21 +0000 (10:00 -0700)
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>
drivers/i2c/chips/it87.c
drivers/i2c/chips/via686a.c
fs/partitions/msdos.c

index 8988f4fa9169f75036339fef6ab780a88095ed85..bf91307a0bb2f5b6fdb926edb2ff1aebd8e4c157 100644 (file)
@@ -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)
index cacc2578fa0406c84c4ad2fb1cfb1c1ec9eeef3f..a49dc222b721f582e11b577f904bf227c519e761 100644 (file)
@@ -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 */
index 584a27b2bbd5a5cfc4317356a28efb3b42ef427f..17ee1b4ff087ee060a9e13a1a4bbe889c9623f22 100644 (file)
@@ -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)) {