ext4: simple_strtol returns signed.
PATCH 1/1 ext4: simple_strtol returns signed.
simple_strtol returns signed.
Signed-off-by Roel Kluin <[email protected]>
---
fs/ext4/super.c +1 -1
@@ -3516,7 +3516,7 @@ static ssize_t ext4_ui_proc_write(struct file *file, const char __user *buf, {unsigned int *p =PDE (file->f_path.dentry->d_inode)->data;char str[32 ]; -unsigned long value; +long value;if (cnt >=sizeof (str))return -EINVAL ;
Theodore Tso
maintainerQuoted 1 line · roel kluin
simple_strtolreturns signed.
Actually the better fix is probably to change the use of simple_strtol() to simple_strtoul().
- Ted
simple_strtol returns signed, but a negative return values is lost when stored in an unsigned. As suggested use simple_strtoul() instead.
Signed-off-by Roel Kluin <[email protected]>
---
Since p is dereferenced with the unsigned long return of simple_strtoul, I think p should be a pointer to an unsigned long, am I wrong?
fs/ext4/super.c +3 -6
@@ -3514,18 +3514,15 @@ static int ext4_ui_proc_open(struct inode *inode, struct file *file)static ssize_t ext4_ui_proc_write (struct file *file,const char __user *buf,size_t cnt,loff_t *ppos) { -unsigned int *p =PDE (file->f_path.dentry->d_inode)->data; +unsigned long *p =PDE (file->f_path.dentry->d_inode)->data;char str[32 ]; -unsigned long value;if (cnt >=sizeof (str))return -EINVAL ;if (copy_from_user (str, buf, cnt))return -EFAULT ; - value =simple_strtol (str,NULL ,0 ); -if (value <0 ) -return -ERANGE ; - *p = value; + + *p =simple_strtoul (str,NULL ,0 );return cnt; }