Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

w1: Misuse of get_user()/put_user() reported by sparse

sparse warnings: (new ones prefixed by >>)
>> drivers/w1/slaves/w1_ds28e04.c:342:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected char [noderef] __user *_pu_addr @@ got char *buf @@
drivers/w1/slaves/w1_ds28e04.c:342:13: sparse: expected char [noderef] __user *_pu_addr
drivers/w1/slaves/w1_ds28e04.c:342:13: sparse: got char *buf
>> drivers/w1/slaves/w1_ds28e04.c:356:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected char const [noderef] __user *_gu_addr @@ got char const *buf @@
drivers/w1/slaves/w1_ds28e04.c:356:13: sparse: expected char const [noderef] __user *_gu_addr
drivers/w1/slaves/w1_ds28e04.c:356:13: sparse: got char const *buf

The buffer buf is a failsafe buffer in kernel space, it's not user
memory hence doesn't deserve the use of get_user() or put_user().

Access 'buf' content directly.

Link: https://lore.kernel.org/lkml/202111190526.K5vb7NWC-lkp@intel.com/T/
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Link: https://lore.kernel.org/r/d14ed8d71ad4372e6839ae427f91441d3ba0e94d.1637946316.git.christophe.leroy@csgroup.eu
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Christophe Leroy and committed by
Greg Kroah-Hartman
33dc3e3e 09184ae9

+6 -20
+6 -20
drivers/w1/slaves/w1_ds28e04.c
··· 32 32 module_param_named(strong_pullup, w1_strong_pullup, int, 0); 33 33 34 34 /* enable/disable CRC checking on DS28E04-100 memory accesses */ 35 - static char w1_enable_crccheck = 1; 35 + static bool w1_enable_crccheck = true; 36 36 37 37 #define W1_EEPROM_SIZE 512 38 38 #define W1_PAGE_COUNT 16 ··· 339 339 static ssize_t crccheck_show(struct device *dev, struct device_attribute *attr, 340 340 char *buf) 341 341 { 342 - if (put_user(w1_enable_crccheck + 0x30, buf)) 343 - return -EFAULT; 344 - 345 - return sizeof(w1_enable_crccheck); 342 + return sysfs_emit(buf, "%d\n", w1_enable_crccheck); 346 343 } 347 344 348 345 static ssize_t crccheck_store(struct device *dev, struct device_attribute *attr, 349 346 const char *buf, size_t count) 350 347 { 351 - char val; 348 + int err = kstrtobool(buf, &w1_enable_crccheck); 352 349 353 - if (count != 1 || !buf) 354 - return -EINVAL; 350 + if (err) 351 + return err; 355 352 356 - if (get_user(val, buf)) 357 - return -EFAULT; 358 - 359 - /* convert to decimal */ 360 - val = val - 0x30; 361 - if (val != 0 && val != 1) 362 - return -EINVAL; 363 - 364 - /* set the new value */ 365 - w1_enable_crccheck = val; 366 - 367 - return sizeof(w1_enable_crccheck); 353 + return count; 368 354 } 369 355 370 356 static DEVICE_ATTR_RW(crccheck);