From 7b830ae4e538cf04d3b57432bb08f58b828dbafa Mon Sep 17 00:00:00 2001 From: srinidhi kasagar Date: Fri, 23 Nov 2012 15:11:00 +0530 Subject: [PATCH] mfd: ab8500-debug: Convert to kstrtoul_from_user Use kstrtoul_from_user for getting an unsigned long from userspace which is less error prone. Signed-off-by: srinidhi kasagar Signed-off-by: Linus Walleij Signed-off-by: Lee Jones Reviewed-by: Jonas ABERG Acked-by: Samuel Ortiz --- drivers/mfd/ab8500-debugfs.c | 100 +++++++++++------------------------ 1 file changed, 30 insertions(+), 70 deletions(-) diff --git a/drivers/mfd/ab8500-debugfs.c b/drivers/mfd/ab8500-debugfs.c index 810ac6faabba..e33c1628c65b 100644 --- a/drivers/mfd/ab8500-debugfs.c +++ b/drivers/mfd/ab8500-debugfs.c @@ -1479,7 +1479,6 @@ static ssize_t ab8500_bank_write(struct file *file, unsigned long user_bank; int err; - /* Get userspace string and assure termination */ err = kstrtoul_from_user(user_buf, count, 0, &user_bank); if (err) return err; @@ -1512,7 +1511,6 @@ static ssize_t ab8500_address_write(struct file *file, unsigned long user_address; int err; - /* Get userspace string and assure termination */ err = kstrtoul_from_user(user_buf, count, 0, &user_address); if (err) return err; @@ -1522,6 +1520,7 @@ static ssize_t ab8500_address_write(struct file *file, return -EINVAL; } debug_address = user_address; + return count; } @@ -1556,7 +1555,6 @@ static ssize_t ab8500_val_write(struct file *file, unsigned long user_val; int err; - /* Get userspace string and assure termination */ err = kstrtoul_from_user(user_buf, count, 0, &user_val); if (err) return err; @@ -2418,20 +2416,13 @@ static ssize_t ab8500_gpadc_avg_sample_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_avg_sample; int err; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_avg_sample); + err = kstrtoul_from_user(user_buf, count, 0, &user_avg_sample); if (err) - return -EINVAL; + return err; + if ((user_avg_sample == SAMPLE_1) || (user_avg_sample == SAMPLE_4) || (user_avg_sample == SAMPLE_8) || (user_avg_sample == SAMPLE_16)) { @@ -2441,7 +2432,8 @@ static ssize_t ab8500_gpadc_avg_sample_write(struct file *file, "should be egal to 1, 4, 8 or 16\n"); return -EINVAL; } - return buf_size; + + return count; } static const struct file_operations ab8500_gpadc_avg_sample_fops = { @@ -2469,20 +2461,13 @@ static ssize_t ab8500_gpadc_trig_edge_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_trig_edge; int err; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_trig_edge); + err = kstrtoul_from_user(user_buf, count, 0, &user_trig_edge); if (err) - return -EINVAL; + return err; + if ((user_trig_edge == RISING_EDGE) || (user_trig_edge == FALLING_EDGE)) { trig_edge = (u8) user_trig_edge; @@ -2492,7 +2477,8 @@ static ssize_t ab8500_gpadc_trig_edge_write(struct file *file, "Enter 1. Falling edge\n"); return -EINVAL; } - return buf_size; + + return count; } static const struct file_operations ab8500_gpadc_trig_edge_fops = { @@ -2520,20 +2506,13 @@ static ssize_t ab8500_gpadc_trig_timer_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_trig_timer; int err; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_trig_timer); + err = kstrtoul_from_user(user_buf, count, 0, &user_trig_timer); if (err) - return -EINVAL; + return err; + if ((user_trig_timer >= 0) && (user_trig_timer <= 255)) { trig_timer = (u8) user_trig_timer; } else { @@ -2541,7 +2520,8 @@ static ssize_t ab8500_gpadc_trig_timer_write(struct file *file, "should be beetween 0 to 255\n"); return -EINVAL; } - return buf_size; + + return count; } static const struct file_operations ab8500_gpadc_trig_timer_fops = { @@ -2569,20 +2549,13 @@ static ssize_t ab8500_gpadc_conv_type_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_conv_type; int err; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf) - 1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_conv_type); + err = kstrtoul_from_user(user_buf, count, 0, &user_conv_type); if (err) - return -EINVAL; + return err; + if ((user_conv_type == ADC_SW) || (user_conv_type == ADC_HW)) { conv_type = (u8) user_conv_type; @@ -2592,7 +2565,8 @@ static ssize_t ab8500_gpadc_conv_type_write(struct file *file, "Enter 1. ADC HW conversion\n"); return -EINVAL; } - return buf_size; + + return count; } static const struct file_operations ab8500_gpadc_conv_type_fops = { @@ -2809,21 +2783,14 @@ static ssize_t ab8500_subscribe_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_val; int err; unsigned int irq_index; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf)-1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_val); + err = kstrtoul_from_user(user_buf, count, 0, &user_val); if (err) - return -EINVAL; + return err; + if (user_val < irq_first) { dev_err(dev, "debugfs error input < %d\n", irq_first); return -EINVAL; @@ -2843,7 +2810,7 @@ static ssize_t ab8500_subscribe_write(struct file *file, */ dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute), GFP_KERNEL); - event_name[irq_index] = kmalloc(buf_size, GFP_KERNEL); + event_name[irq_index] = kmalloc(count, GFP_KERNEL); sprintf(event_name[irq_index], "%lu", user_val); dev_attr[irq_index]->show = show_irq; dev_attr[irq_index]->store = NULL; @@ -2865,7 +2832,7 @@ static ssize_t ab8500_subscribe_write(struct file *file, return err; } - return buf_size; + return count; } static ssize_t ab8500_unsubscribe_write(struct file *file, @@ -2873,21 +2840,14 @@ static ssize_t ab8500_unsubscribe_write(struct file *file, size_t count, loff_t *ppos) { struct device *dev = ((struct seq_file *)(file->private_data))->private; - char buf[32]; - int buf_size; unsigned long user_val; int err; unsigned int irq_index; - /* Get userspace string and assure termination */ - buf_size = min(count, (sizeof(buf)-1)); - if (copy_from_user(buf, user_buf, buf_size)) - return -EFAULT; - buf[buf_size] = 0; - - err = strict_strtoul(buf, 0, &user_val); + err = kstrtoul_from_user(user_buf, count, 0, &user_val); if (err) - return -EINVAL; + return err; + if (user_val < irq_first) { dev_err(dev, "debugfs error input < %d\n", irq_first); return -EINVAL; @@ -2912,7 +2872,7 @@ static ssize_t ab8500_unsubscribe_write(struct file *file, kfree(event_name[irq_index]); kfree(dev_attr[irq_index]); - return buf_size; + return count; } /* -- GitLab