mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	[PATCH] Backlight/LCD Class: Fix sysfs _store error handling
The backlight and LCD class _store functions currently accept values like "34 some random strings" without error. This corrects them to return -EINVAL if the value is not numeric with an optional byte of trailing whitespace. Signed-off-by: Richard Purdie <rpurdie@rpsys.net> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
							parent
							
								
									a8d2e7d952
								
							
						
					
					
						commit
						68673afd44
					
				
					 2 changed files with 28 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -29,12 +29,15 @@ static ssize_t backlight_show_power(struct class_device *cdev, char *buf)
 | 
			
		|||
 | 
			
		||||
static ssize_t backlight_store_power(struct class_device *cdev, const char *buf, size_t count)
 | 
			
		||||
{
 | 
			
		||||
	int rc = -ENXIO, power;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	char *endp;
 | 
			
		||||
	struct backlight_device *bd = to_backlight_device(cdev);
 | 
			
		||||
	int power = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	size_t size = endp - buf;
 | 
			
		||||
 | 
			
		||||
	power = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	if (*endp && !isspace(*endp))
 | 
			
		||||
	if (*endp && isspace(*endp))
 | 
			
		||||
		size++;
 | 
			
		||||
	if (size != count)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	down(&bd->sem);
 | 
			
		||||
| 
						 | 
				
			
			@ -65,12 +68,15 @@ static ssize_t backlight_show_brightness(struct class_device *cdev, char *buf)
 | 
			
		|||
 | 
			
		||||
static ssize_t backlight_store_brightness(struct class_device *cdev, const char *buf, size_t count)
 | 
			
		||||
{
 | 
			
		||||
	int rc = -ENXIO, brightness;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	char *endp;
 | 
			
		||||
	struct backlight_device *bd = to_backlight_device(cdev);
 | 
			
		||||
	int brightness = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	size_t size = endp - buf;
 | 
			
		||||
 | 
			
		||||
	brightness = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	if (*endp && !isspace(*endp))
 | 
			
		||||
	if (*endp && isspace(*endp))
 | 
			
		||||
		size++;
 | 
			
		||||
	if (size != count)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	down(&bd->sem);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,12 +31,15 @@ static ssize_t lcd_show_power(struct class_device *cdev, char *buf)
 | 
			
		|||
 | 
			
		||||
static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_t count)
 | 
			
		||||
{
 | 
			
		||||
	int rc, power;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	char *endp;
 | 
			
		||||
	struct lcd_device *ld = to_lcd_device(cdev);
 | 
			
		||||
	int power = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	size_t size = endp - buf;
 | 
			
		||||
 | 
			
		||||
	power = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	if (*endp && !isspace(*endp))
 | 
			
		||||
	if (*endp && isspace(*endp))
 | 
			
		||||
		size++;
 | 
			
		||||
	if (size != count)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	down(&ld->sem);
 | 
			
		||||
| 
						 | 
				
			
			@ -44,8 +47,7 @@ static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_
 | 
			
		|||
		pr_debug("lcd: set power to %d\n", power);
 | 
			
		||||
		ld->props->set_power(ld, power);
 | 
			
		||||
		rc = count;
 | 
			
		||||
	} else
 | 
			
		||||
		rc = -ENXIO;
 | 
			
		||||
	}
 | 
			
		||||
	up(&ld->sem);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,14 +55,12 @@ static ssize_t lcd_store_power(struct class_device *cdev, const char *buf, size_
 | 
			
		|||
 | 
			
		||||
static ssize_t lcd_show_contrast(struct class_device *cdev, char *buf)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	struct lcd_device *ld = to_lcd_device(cdev);
 | 
			
		||||
 | 
			
		||||
	down(&ld->sem);
 | 
			
		||||
	if (likely(ld->props && ld->props->get_contrast))
 | 
			
		||||
		rc = sprintf(buf, "%d\n", ld->props->get_contrast(ld));
 | 
			
		||||
	else
 | 
			
		||||
		rc = -ENXIO;
 | 
			
		||||
	up(&ld->sem);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
| 
						 | 
				
			
			@ -68,12 +68,15 @@ static ssize_t lcd_show_contrast(struct class_device *cdev, char *buf)
 | 
			
		|||
 | 
			
		||||
static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, size_t count)
 | 
			
		||||
{
 | 
			
		||||
	int rc, contrast;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	char *endp;
 | 
			
		||||
	struct lcd_device *ld = to_lcd_device(cdev);
 | 
			
		||||
	int contrast = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	size_t size = endp - buf;
 | 
			
		||||
 | 
			
		||||
	contrast = simple_strtoul(buf, &endp, 0);
 | 
			
		||||
	if (*endp && !isspace(*endp))
 | 
			
		||||
	if (*endp && isspace(*endp))
 | 
			
		||||
		size++;
 | 
			
		||||
	if (size != count)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	down(&ld->sem);
 | 
			
		||||
| 
						 | 
				
			
			@ -81,8 +84,7 @@ static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, si
 | 
			
		|||
		pr_debug("lcd: set contrast to %d\n", contrast);
 | 
			
		||||
		ld->props->set_contrast(ld, contrast);
 | 
			
		||||
		rc = count;
 | 
			
		||||
	} else
 | 
			
		||||
		rc = -ENXIO;
 | 
			
		||||
	}
 | 
			
		||||
	up(&ld->sem);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,14 +92,12 @@ static ssize_t lcd_store_contrast(struct class_device *cdev, const char *buf, si
 | 
			
		|||
 | 
			
		||||
static ssize_t lcd_show_max_contrast(struct class_device *cdev, char *buf)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
	int rc = -ENXIO;
 | 
			
		||||
	struct lcd_device *ld = to_lcd_device(cdev);
 | 
			
		||||
 | 
			
		||||
	down(&ld->sem);
 | 
			
		||||
	if (likely(ld->props))
 | 
			
		||||
		rc = sprintf(buf, "%d\n", ld->props->max_contrast);
 | 
			
		||||
	else
 | 
			
		||||
		rc = -ENXIO;
 | 
			
		||||
	up(&ld->sem);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue