aboutsummaryrefslogtreecommitdiff
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-04-29 14:43:23 -0700
commite7cdb1af9b0d3c933e03df1f1d77050374b3db9d (patch)
tree821daae18dc0f827fee7f6c7ade569205f6c54a5
parent6a99bede0be21d5af98ff1d4e93a8357eb9c323d (diff)
downloadvexpress-lsk-e7cdb1af9b0d3c933e03df1f1d77050374b3db9d.tar.gz
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>
-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(