Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f972202 authored by Cornelia Huck's avatar Cornelia Huck Committed by Martin Schwidefsky
Browse files

[S390] cio: Use strict_strtoul() for attributes.



Make parsing of attribute writes handle incorrect input better.

Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 0ff5ce7f
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -318,7 +318,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
{
	struct ccwgroup_device *gdev;
	struct ccwgroup_driver *gdrv;
	unsigned int value;
	unsigned long value;
	int ret;

	gdev = to_ccwgroupdev(dev);
@@ -329,7 +329,9 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
	if (!try_module_get(gdrv->owner))
		return -EINVAL;

	value = simple_strtoul(buf, NULL, 0);
	ret = strict_strtoul(buf, 0, &value);
	if (ret)
		goto out;
	ret = count;
	if (value == 1)
		ccwgroup_set_online(gdev);
@@ -337,6 +339,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
		ccwgroup_set_offline(gdev);
	else
		ret = -EINVAL;
out:
	module_put(gdrv->owner);
	return ret;
}
+8 −3
Original line number Diff line number Diff line
@@ -1219,16 +1219,21 @@ static ssize_t cmb_enable_store(struct device *dev,
{
	struct ccw_device *cdev;
	int ret;
	unsigned long val;

	ret = strict_strtoul(buf, 16, &val);
	if (ret)
		return ret;

	cdev = to_ccwdev(dev);

	switch (buf[0]) {
	case '0':
	switch (val) {
	case 0:
		ret = disable_cmf(cdev);
		if (ret)
			dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret);
		break;
	case '1':
	case 1:
		ret = enable_cmf(cdev);
		if (ret && ret != -EBUSY)
			dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret);
+7 −3
Original line number Diff line number Diff line
@@ -705,13 +705,17 @@ css_cm_enable_store(struct device *dev, struct device_attribute *attr,
{
	struct channel_subsystem *css = to_css(dev);
	int ret;
	unsigned long val;

	ret = strict_strtoul(buf, 16, &val);
	if (ret)
		return ret;
	mutex_lock(&css->mutex);
	switch (buf[0]) {
	case '0':
	switch (val) {
	case 0:
		ret = css->cm_enabled ? chsc_secm(css, 0) : 0;
		break;
	case '1':
	case 1:
		ret = css->cm_enabled ? 0 : chsc_secm(css, 1);
		break;
	default:
+11 −6
Original line number Diff line number Diff line
@@ -512,8 +512,8 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
			     const char *buf, size_t count)
{
	struct ccw_device *cdev = to_ccwdev(dev);
	int i, force;
	char *tmp;
	int force, ret;
	unsigned long i;

	if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0)
		return -EAGAIN;
@@ -525,25 +525,30 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr,
	if (!strncmp(buf, "force\n", count)) {
		force = 1;
		i = 1;
		ret = 0;
	} else {
		force = 0;
		i = simple_strtoul(buf, &tmp, 16);
		ret = strict_strtoul(buf, 16, &i);
	}

	if (ret)
		goto out;
	switch (i) {
	case 0:
		online_store_handle_offline(cdev);
		ret = count;
		break;
	case 1:
		online_store_handle_online(cdev, force);
		ret = count;
		break;
	default:
		count = -EINVAL;
		ret = -EINVAL;
	}
out:
	if (cdev->drv)
		module_put(cdev->drv->owner);
	atomic_set(&cdev->private->onoff, 0);
	return count;
	return ret;
}

static ssize_t
+4 −4
Original line number Diff line number Diff line
@@ -3663,11 +3663,11 @@ qdio_performance_stats_show(struct bus_type *bus, char *buf)
static ssize_t
qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count)
{
	char *tmp;
	int i;
	unsigned long i;
	int ret;

	i = simple_strtoul(buf, &tmp, 16);
	if ((i == 0) || (i == 1)) {
	ret = strict_strtoul(buf, 16, &i);
	if (!ret && ((i == 0) || (i == 1))) {
		if (i == qdio_performance_stats)
			return count;
		qdio_performance_stats = i;