Commit 99481d21 authored by Likhitha Korrapati's avatar Likhitha Korrapati Committed by Shuah Khan
Browse files

cpupower: Fix cpuidle_set to accept only numeric values for idle-set operation.



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: default avatarBrahadambal Srinivasan <latha@linux.vnet.ibm.com>
Signed-off-by: default avatarLikhitha Korrapati <likhitha@linux.ibm.com>
Tested-by: default avatarPavithra Prakash <pavrampu@linux.vnet.ibm.com>
Reviewed-by: default avatarRick Lindsley <ricklind@linux.vnet.ibm.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent eb426fc6
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -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;
			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) {