aboutsummaryrefslogtreecommitdiff
path: root/drivers/cpufreq
diff options
context:
space:
mode:
authorTodd Poynor <toddpoynor@google.com>2013-03-20 15:40:46 -0700
committerArve Hjønnevåg <arve@android.com>2013-07-01 14:16:23 -0700
commiteb58ca7afd0cc9736f4e13acb488c0273d060077 (patch)
tree749d663b8a3eb6330c416eb67534167bc814b1c0 /drivers/cpufreq
parentfb117edf60e2c1e58f28859387d8bf2669a66907 (diff)
cpufreq: interactive: fix crash on error paths in get_tokenized_data
Use separate variable for error code, free proper pointer. Change-Id: Ia83cccb195997789ac6afbf5b8761f7b278196d6 Reported-by: Arve Hjønnevåg <arve@android.com> Signed-off-by: Todd Poynor <toddpoynor@google.com>
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 7c734fa57e2..3dc067e6eb4 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -647,29 +647,26 @@ static unsigned int *get_tokenized_data(const char *buf, int *num_tokens)
int i;
int ntokens = 1;
unsigned int *tokenized_data;
+ int err = -EINVAL;
cp = buf;
while ((cp = strpbrk(cp + 1, " :")))
ntokens++;
- if (!(ntokens & 0x1)) {
- tokenized_data = ERR_PTR(-EINVAL);
+ if (!(ntokens & 0x1))
goto err;
- }
tokenized_data = kmalloc(ntokens * sizeof(unsigned int), GFP_KERNEL);
if (!tokenized_data) {
- tokenized_data = ERR_PTR(-ENOMEM);
+ err = -ENOMEM;
goto err;
}
cp = buf;
i = 0;
while (i < ntokens) {
- if (sscanf(cp, "%u", &tokenized_data[i++]) != 1) {
- tokenized_data = ERR_PTR(-EINVAL);
+ if (sscanf(cp, "%u", &tokenized_data[i++]) != 1)
goto err_kfree;
- }
cp = strpbrk(cp, " :");
if (!cp)
@@ -677,10 +674,8 @@ static unsigned int *get_tokenized_data(const char *buf, int *num_tokens)
cp++;
}
- if (i != ntokens) {
- tokenized_data = ERR_PTR(-EINVAL);
+ if (i != ntokens)
goto err_kfree;
- }
*num_tokens = ntokens;
return tokenized_data;
@@ -688,7 +683,7 @@ static unsigned int *get_tokenized_data(const char *buf, int *num_tokens)
err_kfree:
kfree(tokenized_data);
err:
- return tokenized_data;
+ return ERR_PTR(err);
}
static ssize_t show_target_loads(