diff mbox

[v1,1/3] PM / sysfs: Convert to use sysfs_streq()

Message ID 20171110182809.85953-1-andriy.shevchenko@linux.intel.com (mailing list archive)
State Mainlined
Delegated to: Rafael Wysocki
Headers show

Commit Message

Andy Shevchenko Nov. 10, 2017, 6:28 p.m. UTC
...instead of custom approach.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/base/power/sysfs.c | 39 +++++++++------------------------------
 1 file changed, 9 insertions(+), 30 deletions(-)

Comments

Pavel Machek Nov. 15, 2017, 10:32 a.m. UTC | #1
Hi!

> ...instead of custom approach.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/base/power/sysfs.c | 39 +++++++++------------------------------
>  1 file changed, 9 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
> index e153e28b1857..662632ac5e0e 100644
> --- a/drivers/base/power/sysfs.c
> +++ b/drivers/base/power/sysfs.c
> @@ -108,16 +108,10 @@ static ssize_t control_show(struct device *dev, struct device_attribute *attr,
>  static ssize_t control_store(struct device * dev, struct device_attribute *attr,
>  			     const char * buf, size_t n)
>  {
> -	char *cp;
> -	int len = n;
> -
> -	cp = memchr(buf, '\n', n);
> -	if (cp)
> -		len = cp - buf;
>  	device_lock(dev);
> -	if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
> +	if (sysfs_streq(buf, ctrl_auto))
>  		pm_runtime_allow(dev);
> -	else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
> +	else if (sysfs_streq(buf, ctrl_on))
>  		pm_runtime_forbid(dev);
>  	else
>  		n = -EINVAL;

Are you sure? _streq does not get passed size_t n; how does it
guarantee no out-of-bounds access?

Best regards,
									Pavel
Andy Shevchenko Nov. 15, 2017, 11:41 a.m. UTC | #2
On Wed, 2017-11-15 at 11:32 +0100, Pavel Machek wrote:
> Hi!
> 
> > ...instead of custom approach.
> > 

> >  			     const char * buf, size_t n)
> >  {
> > -	char *cp;
> > -	int len = n;
> > -
> > -	cp = memchr(buf, '\n', n);
> > -	if (cp)
> > -		len = cp - buf;
> >  	device_lock(dev);
> > -	if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto,
> > len) == 0)
> > +	if (sysfs_streq(buf, ctrl_auto))
> >  		pm_runtime_allow(dev);
> > -	else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on,
> > len) == 0)
> > +	else if (sysfs_streq(buf, ctrl_on))
> >  		pm_runtime_forbid(dev);
> >  	else
> >  		n = -EINVAL;
> 
> Are you sure?

Yes.

>  _streq does not get passed size_t n; how does it
> guarantee no out-of-bounds access?

It's guaranteed by kernfs for every attribute that relies on it.

https://www.spinics.net/lists/kernel/msg2635067.html
Pavel Machek Nov. 15, 2017, 12:01 p.m. UTC | #3
On Fri 2017-11-10 20:28:07, Andy Shevchenko wrote:
> ...instead of custom approach.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Acked-by: Pavel Machek <pavel@ucw.cz>

> ---
>  drivers/base/power/sysfs.c | 39 +++++++++------------------------------
>  1 file changed, 9 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
> index e153e28b1857..662632ac5e0e 100644
> --- a/drivers/base/power/sysfs.c
> +++ b/drivers/base/power/sysfs.c
> @@ -108,16 +108,10 @@ static ssize_t control_show(struct device *dev, struct device_attribute *attr,
>  static ssize_t control_store(struct device * dev, struct device_attribute *attr,
>  			     const char * buf, size_t n)
>  {
> -	char *cp;
> -	int len = n;
> -
> -	cp = memchr(buf, '\n', n);
> -	if (cp)
> -		len = cp - buf;
>  	device_lock(dev);
> -	if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
> +	if (sysfs_streq(buf, ctrl_auto))
>  		pm_runtime_allow(dev);
> -	else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
> +	else if (sysfs_streq(buf, ctrl_on))
>  		pm_runtime_forbid(dev);
>  	else
>  		n = -EINVAL;
> @@ -245,7 +239,7 @@ static ssize_t pm_qos_resume_latency_store(struct device *dev,
>  
>  		if (value == 0)
>  			value = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
> -	} else if (!strcmp(buf, "n/a") || !strcmp(buf, "n/a\n")) {
> +	} else if (sysfs_streq(buf, "n/a")) {
>  		value = 0;
>  	} else {
>  		return -EINVAL;
> @@ -285,9 +279,9 @@ static ssize_t pm_qos_latency_tolerance_store(struct device *dev,
>  		if (value < 0)
>  			return -EINVAL;
>  	} else {
> -		if (!strcmp(buf, "auto") || !strcmp(buf, "auto\n"))
> +		if (sysfs_streq(buf, "auto"))
>  			value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
> -		else if (!strcmp(buf, "any") || !strcmp(buf, "any\n"))
> +		else if (sysfs_streq(buf, "any"))
>  			value = PM_QOS_LATENCY_ANY;
>  		else
>  			return -EINVAL;
> @@ -342,20 +336,12 @@ static ssize_t
>  wake_store(struct device * dev, struct device_attribute *attr,
>  	const char * buf, size_t n)
>  {
> -	char *cp;
> -	int len = n;
> -
>  	if (!device_can_wakeup(dev))
>  		return -EINVAL;
>  
> -	cp = memchr(buf, '\n', n);
> -	if (cp)
> -		len = cp - buf;
> -	if (len == sizeof _enabled - 1
> -			&& strncmp(buf, _enabled, sizeof _enabled - 1) == 0)
> +	if (sysfs_streq(buf, _enabled))
>  		device_set_wakeup_enable(dev, 1);
> -	else if (len == sizeof _disabled - 1
> -			&& strncmp(buf, _disabled, sizeof _disabled - 1) == 0)
> +	else if (sysfs_streq(buf, _disabled))
>  		device_set_wakeup_enable(dev, 0);
>  	else
>  		return -EINVAL;
> @@ -566,16 +552,9 @@ static ssize_t async_show(struct device *dev, struct device_attribute *attr,
>  static ssize_t async_store(struct device *dev, struct device_attribute *attr,
>  			   const char *buf, size_t n)
>  {
> -	char *cp;
> -	int len = n;
> -
> -	cp = memchr(buf, '\n', n);
> -	if (cp)
> -		len = cp - buf;
> -	if (len == sizeof _enabled - 1 && strncmp(buf, _enabled, len) == 0)
> +	if (sysfs_streq(buf, _enabled))
>  		device_enable_async_suspend(dev);
> -	else if (len == sizeof _disabled - 1 &&
> -		 strncmp(buf, _disabled, len) == 0)
> +	else if (sysfs_streq(buf, _disabled))
>  		device_disable_async_suspend(dev);
>  	else
>  		return -EINVAL;
Rafael J. Wysocki Dec. 6, 2017, 1 a.m. UTC | #4
On Friday, November 10, 2017 7:28:07 PM CET Andy Shevchenko wrote:
> ...instead of custom approach.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

All [1-3/3] applied.

Thanks,
Rafael
diff mbox

Patch

diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c
index e153e28b1857..662632ac5e0e 100644
--- a/drivers/base/power/sysfs.c
+++ b/drivers/base/power/sysfs.c
@@ -108,16 +108,10 @@  static ssize_t control_show(struct device *dev, struct device_attribute *attr,
 static ssize_t control_store(struct device * dev, struct device_attribute *attr,
 			     const char * buf, size_t n)
 {
-	char *cp;
-	int len = n;
-
-	cp = memchr(buf, '\n', n);
-	if (cp)
-		len = cp - buf;
 	device_lock(dev);
-	if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
+	if (sysfs_streq(buf, ctrl_auto))
 		pm_runtime_allow(dev);
-	else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
+	else if (sysfs_streq(buf, ctrl_on))
 		pm_runtime_forbid(dev);
 	else
 		n = -EINVAL;
@@ -245,7 +239,7 @@  static ssize_t pm_qos_resume_latency_store(struct device *dev,
 
 		if (value == 0)
 			value = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
-	} else if (!strcmp(buf, "n/a") || !strcmp(buf, "n/a\n")) {
+	} else if (sysfs_streq(buf, "n/a")) {
 		value = 0;
 	} else {
 		return -EINVAL;
@@ -285,9 +279,9 @@  static ssize_t pm_qos_latency_tolerance_store(struct device *dev,
 		if (value < 0)
 			return -EINVAL;
 	} else {
-		if (!strcmp(buf, "auto") || !strcmp(buf, "auto\n"))
+		if (sysfs_streq(buf, "auto"))
 			value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT;
-		else if (!strcmp(buf, "any") || !strcmp(buf, "any\n"))
+		else if (sysfs_streq(buf, "any"))
 			value = PM_QOS_LATENCY_ANY;
 		else
 			return -EINVAL;
@@ -342,20 +336,12 @@  static ssize_t
 wake_store(struct device * dev, struct device_attribute *attr,
 	const char * buf, size_t n)
 {
-	char *cp;
-	int len = n;
-
 	if (!device_can_wakeup(dev))
 		return -EINVAL;
 
-	cp = memchr(buf, '\n', n);
-	if (cp)
-		len = cp - buf;
-	if (len == sizeof _enabled - 1
-			&& strncmp(buf, _enabled, sizeof _enabled - 1) == 0)
+	if (sysfs_streq(buf, _enabled))
 		device_set_wakeup_enable(dev, 1);
-	else if (len == sizeof _disabled - 1
-			&& strncmp(buf, _disabled, sizeof _disabled - 1) == 0)
+	else if (sysfs_streq(buf, _disabled))
 		device_set_wakeup_enable(dev, 0);
 	else
 		return -EINVAL;
@@ -566,16 +552,9 @@  static ssize_t async_show(struct device *dev, struct device_attribute *attr,
 static ssize_t async_store(struct device *dev, struct device_attribute *attr,
 			   const char *buf, size_t n)
 {
-	char *cp;
-	int len = n;
-
-	cp = memchr(buf, '\n', n);
-	if (cp)
-		len = cp - buf;
-	if (len == sizeof _enabled - 1 && strncmp(buf, _enabled, len) == 0)
+	if (sysfs_streq(buf, _enabled))
 		device_enable_async_suspend(dev);
-	else if (len == sizeof _disabled - 1 &&
-		 strncmp(buf, _disabled, len) == 0)
+	else if (sysfs_streq(buf, _disabled))
 		device_disable_async_suspend(dev);
 	else
 		return -EINVAL;