]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
cpupower: Fix cpuidle_set to accept only numeric values for idle-set operation.
authorLikhitha Korrapati <likhitha@linux.ibm.com>
Fri, 14 Jul 2023 09:40:21 +0000 (15:10 +0530)
committerShuah Khan <skhan@linuxfoundation.org>
Tue, 18 Jul 2023 22:07:08 +0000 (16:07 -0600)
For both the d and e options in 'cpupower idle_set' command, an
atoi() conversion is done without checking if the input argument
is all numeric. So, an atoi conversion is done on any character
provided as input and the CPU idle_set operation continues with
that integer value, which may not be what is intended or entirely
correct.

The output of cpuidle-set before patch is as follows:

[root@xxx cpupower]# cpupower idle-set -e 1$
Idlestate 1 enabled on CPU 0
[snip]
Idlestate 1 enabled on CPU 47

[root@xxx cpupower]# cpupower idle-set -e 11
Idlestate 11 not available on CPU 0
[snip]
Idlestate 11 not available on CPU 47

[root@xxx cpupower]# cpupower idle-set -d 12
Idlestate 12 not available on CPU 0
[snip]
Idlestate 12 not available on CPU 47

[root@xxx cpupower]# cpupower idle-set -d qw
Idlestate 0 disabled on CPU 0
[snip]
Idlestate 0 disabled on CPU 47

This patch adds a check for both d and e options in cpuidle-set.c
to see that the idle_set value is all numeric before doing a
string-to-int conversion using strtol().

The output of cpuidle-set after the patch is as below:

[root@xxx cpupower]# ./cpupower idle-set -e 1$
Bad idle_set value: 1$. Integer expected

[root@xxx cpupower]# ./cpupower idle-set -e 11
Idlestate 11 not available on CPU 0
[snip]
Idlestate 11 not available on CPU 47

[root@xxx cpupower]# ./cpupower idle-set -d 12
Idlestate 12 not available on CPU 0
[snip]
Idlestate 12 not available on CPU 47

[root@xxx cpupower]# ./cpupower idle-set -d qw
Bad idle_set value: qw. Integer expected

Signed-off-by: Brahadambal Srinivasan <latha@linux.vnet.ibm.com>
Signed-off-by: Likhitha Korrapati <likhitha@linux.ibm.com>
Tested-by: Pavithra Prakash <pavrampu@linux.vnet.ibm.com>
Reviewed-by: Rick Lindsley <ricklind@linux.vnet.ibm.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/power/cpupower/utils/cpuidle-set.c

index 46158928f9adf5cdac1a483a6161eaca5e87ac35..a551d1d4ac51307355a45dfeea106791eb61c111 100644 (file)
@@ -41,14 +41,6 @@ int cmd_idle_set(int argc, char **argv)
                        cont = 0;
                        break;
                case 'd':
-                       if (param) {
-                               param = -1;
-                               cont = 0;
-                               break;
-                       }
-                       param = ret;
-                       idlestate = atoi(optarg);
-                       break;
                case 'e':
                        if (param) {
                                param = -1;
@@ -56,7 +48,13 @@ int cmd_idle_set(int argc, char **argv)
                                break;
                        }
                        param = ret;
-                       idlestate = atoi(optarg);
+                       strtol(optarg, &endptr, 10);
+                       if (*endptr != '\0') {
+                               printf(_("Bad value: %s, Integer expected\n"), optarg);
+                               exit(EXIT_FAILURE);
+                       } else {
+                               idlestate = atoi(optarg);
+                       }
                        break;
                case 'D':
                        if (param) {