From: Todd Poynor Date: Wed, 20 Mar 2013 22:40:46 +0000 (-0700) Subject: cpufreq: interactive: fix crash on error paths in get_tokenized_data X-Git-Tag: firefly_0821_release~4090^2~590 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=eb58ca7afd0cc9736f4e13acb488c0273d060077;p=firefly-linux-kernel-4.4.55.git 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 Signed-off-by: Todd Poynor --- diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index 7c734fa57e24..3dc067e6eb45 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(