diff options
author | David Fries <david@fries.net> | 2008-10-16 01:04:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:21:50 -0400 |
commit | 347ba8a588c3e49f357291e5a1ac38a11d7e052d (patch) | |
tree | e3f67be1903df707e60116f841b8082da7facc7b /drivers/w1/w1.h | |
parent | 07e003417b88deac4b887c98f499fc3b01bc8df0 (diff) |
W1: w1_therm fix user buffer overflow and cat
Fixed data reading bug by replacing binary attribute with device one.
Switching the sysfs read from bin_attribute to device_attribute. The data
is far under PAGE_SIZE so the binary interface isn't required. As the
device_attribute interface will make one call to w1_therm_read per file
open and buffer, the result is, the following problems go away.
buffer overflow:
Execute a short read on w1_slave and w1_therm_read_bin would still
return the full string size worth of data clobbering the user space
buffer when it returned. Switching to device_attribute avoids the
buffer overflow problems. With the snprintf formatted output dealing
with short reads without doing a conversion per read would have
been difficult.
bad behavior:
`cat w1_slave` would cause two temperature conversions to take place.
Previously the code assumed W1_SLAVE_DATA_SIZE would be returned with
each read. It would not return 0 unless the offset was less
than W1_SLAVE_DATA_SIZE. The result was the first read did a
temperature conversion, filled the buffer and returned, the
offset in the second read would be less than
W1_SLAVE_DATA_SIZE and also fill the buffer and return, the
third read would finnally have a big enough offset to return 0
and cause cat to stop. Now w1_therm_read will be called at
most once per open.
Signed-off-by: David Fries <david@fries.net>
Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/w1/w1.h')
-rw-r--r-- | drivers/w1/w1.h | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/drivers/w1/w1.h b/drivers/w1/w1.h index 00b84ab22808..cdaa6fffbfc7 100644 --- a/drivers/w1/w1.h +++ b/drivers/w1/w1.h | |||
@@ -46,7 +46,6 @@ struct w1_reg_num | |||
46 | #include "w1_family.h" | 46 | #include "w1_family.h" |
47 | 47 | ||
48 | #define W1_MAXNAMELEN 32 | 48 | #define W1_MAXNAMELEN 32 |
49 | #define W1_SLAVE_DATA_SIZE 128 | ||
50 | 49 | ||
51 | #define W1_SEARCH 0xF0 | 50 | #define W1_SEARCH 0xF0 |
52 | #define W1_ALARM_SEARCH 0xEC | 51 | #define W1_ALARM_SEARCH 0xEC |