diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2008-04-30 07:38:33 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2008-04-30 07:38:43 -0400 |
commit | 2f972202315cf71fd60e890ebbed7d5bcf620ba4 (patch) | |
tree | 80e43d5bacb7b85417168bc257369d3642cc196c /drivers/s390 | |
parent | 0ff5ce7f30b45cc2014cec465c0e96c16877116e (diff) |
[S390] cio: Use strict_strtoul() for attributes.
Make parsing of attribute writes handle incorrect input better.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/cio/ccwgroup.c | 7 | ||||
-rw-r--r-- | drivers/s390/cio/cmf.c | 11 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 10 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 17 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.c | 8 |
5 files changed, 35 insertions, 18 deletions
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index fe1ad172215..85b2e51a42a 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -318,7 +318,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
318 | { | 318 | { |
319 | struct ccwgroup_device *gdev; | 319 | struct ccwgroup_device *gdev; |
320 | struct ccwgroup_driver *gdrv; | 320 | struct ccwgroup_driver *gdrv; |
321 | unsigned int value; | 321 | unsigned long value; |
322 | int ret; | 322 | int ret; |
323 | 323 | ||
324 | gdev = to_ccwgroupdev(dev); | 324 | gdev = to_ccwgroupdev(dev); |
@@ -329,7 +329,9 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
329 | if (!try_module_get(gdrv->owner)) | 329 | if (!try_module_get(gdrv->owner)) |
330 | return -EINVAL; | 330 | return -EINVAL; |
331 | 331 | ||
332 | value = simple_strtoul(buf, NULL, 0); | 332 | ret = strict_strtoul(buf, 0, &value); |
333 | if (ret) | ||
334 | goto out; | ||
333 | ret = count; | 335 | ret = count; |
334 | if (value == 1) | 336 | if (value == 1) |
335 | ccwgroup_set_online(gdev); | 337 | ccwgroup_set_online(gdev); |
@@ -337,6 +339,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
337 | ccwgroup_set_offline(gdev); | 339 | ccwgroup_set_offline(gdev); |
338 | else | 340 | else |
339 | ret = -EINVAL; | 341 | ret = -EINVAL; |
342 | out: | ||
340 | module_put(gdrv->owner); | 343 | module_put(gdrv->owner); |
341 | return ret; | 344 | return ret; |
342 | } | 345 | } |
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index f4c132ab39e..2808b6833b9 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c | |||
@@ -1219,16 +1219,21 @@ static ssize_t cmb_enable_store(struct device *dev, | |||
1219 | { | 1219 | { |
1220 | struct ccw_device *cdev; | 1220 | struct ccw_device *cdev; |
1221 | int ret; | 1221 | int ret; |
1222 | unsigned long val; | ||
1223 | |||
1224 | ret = strict_strtoul(buf, 16, &val); | ||
1225 | if (ret) | ||
1226 | return ret; | ||
1222 | 1227 | ||
1223 | cdev = to_ccwdev(dev); | 1228 | cdev = to_ccwdev(dev); |
1224 | 1229 | ||
1225 | switch (buf[0]) { | 1230 | switch (val) { |
1226 | case '0': | 1231 | case 0: |
1227 | ret = disable_cmf(cdev); | 1232 | ret = disable_cmf(cdev); |
1228 | if (ret) | 1233 | if (ret) |
1229 | dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret); | 1234 | dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret); |
1230 | break; | 1235 | break; |
1231 | case '1': | 1236 | case 1: |
1232 | ret = enable_cmf(cdev); | 1237 | ret = enable_cmf(cdev); |
1233 | if (ret && ret != -EBUSY) | 1238 | if (ret && ret != -EBUSY) |
1234 | dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret); | 1239 | dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret); |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index c1afab5f72d..595e327d2f7 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -705,13 +705,17 @@ css_cm_enable_store(struct device *dev, struct device_attribute *attr, | |||
705 | { | 705 | { |
706 | struct channel_subsystem *css = to_css(dev); | 706 | struct channel_subsystem *css = to_css(dev); |
707 | int ret; | 707 | int ret; |
708 | unsigned long val; | ||
708 | 709 | ||
710 | ret = strict_strtoul(buf, 16, &val); | ||
711 | if (ret) | ||
712 | return ret; | ||
709 | mutex_lock(&css->mutex); | 713 | mutex_lock(&css->mutex); |
710 | switch (buf[0]) { | 714 | switch (val) { |
711 | case '0': | 715 | case 0: |
712 | ret = css->cm_enabled ? chsc_secm(css, 0) : 0; | 716 | ret = css->cm_enabled ? chsc_secm(css, 0) : 0; |
713 | break; | 717 | break; |
714 | case '1': | 718 | case 1: |
715 | ret = css->cm_enabled ? 0 : chsc_secm(css, 1); | 719 | ret = css->cm_enabled ? 0 : chsc_secm(css, 1); |
716 | break; | 720 | break; |
717 | default: | 721 | default: |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index e0c7adb8958..abfd601d237 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -512,8 +512,8 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr, | |||
512 | const char *buf, size_t count) | 512 | const char *buf, size_t count) |
513 | { | 513 | { |
514 | struct ccw_device *cdev = to_ccwdev(dev); | 514 | struct ccw_device *cdev = to_ccwdev(dev); |
515 | int i, force; | 515 | int force, ret; |
516 | char *tmp; | 516 | unsigned long i; |
517 | 517 | ||
518 | if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) | 518 | if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) |
519 | return -EAGAIN; | 519 | return -EAGAIN; |
@@ -525,25 +525,30 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr, | |||
525 | if (!strncmp(buf, "force\n", count)) { | 525 | if (!strncmp(buf, "force\n", count)) { |
526 | force = 1; | 526 | force = 1; |
527 | i = 1; | 527 | i = 1; |
528 | ret = 0; | ||
528 | } else { | 529 | } else { |
529 | force = 0; | 530 | force = 0; |
530 | i = simple_strtoul(buf, &tmp, 16); | 531 | ret = strict_strtoul(buf, 16, &i); |
531 | } | 532 | } |
532 | 533 | if (ret) | |
534 | goto out; | ||
533 | switch (i) { | 535 | switch (i) { |
534 | case 0: | 536 | case 0: |
535 | online_store_handle_offline(cdev); | 537 | online_store_handle_offline(cdev); |
538 | ret = count; | ||
536 | break; | 539 | break; |
537 | case 1: | 540 | case 1: |
538 | online_store_handle_online(cdev, force); | 541 | online_store_handle_online(cdev, force); |
542 | ret = count; | ||
539 | break; | 543 | break; |
540 | default: | 544 | default: |
541 | count = -EINVAL; | 545 | ret = -EINVAL; |
542 | } | 546 | } |
547 | out: | ||
543 | if (cdev->drv) | 548 | if (cdev->drv) |
544 | module_put(cdev->drv->owner); | 549 | module_put(cdev->drv->owner); |
545 | atomic_set(&cdev->private->onoff, 0); | 550 | atomic_set(&cdev->private->onoff, 0); |
546 | return count; | 551 | return ret; |
547 | } | 552 | } |
548 | 553 | ||
549 | static ssize_t | 554 | static ssize_t |
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 43876e28737..445cf364e46 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -3663,11 +3663,11 @@ qdio_performance_stats_show(struct bus_type *bus, char *buf) | |||
3663 | static ssize_t | 3663 | static ssize_t |
3664 | qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count) | 3664 | qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count) |
3665 | { | 3665 | { |
3666 | char *tmp; | 3666 | unsigned long i; |
3667 | int i; | 3667 | int ret; |
3668 | 3668 | ||
3669 | i = simple_strtoul(buf, &tmp, 16); | 3669 | ret = strict_strtoul(buf, 16, &i); |
3670 | if ((i == 0) || (i == 1)) { | 3670 | if (!ret && ((i == 0) || (i == 1))) { |
3671 | if (i == qdio_performance_stats) | 3671 | if (i == qdio_performance_stats) |
3672 | return count; | 3672 | return count; |
3673 | qdio_performance_stats = i; | 3673 | qdio_performance_stats = i; |