eina_cpu: Fix coverity defects in eina_cpu_map_init

Fixes a potential fd leak on failure and wrong core to
speed mapping on systems with > 31 cpu cores

CID: 1362860
CID: 1362859
CID: 1362857
This commit is contained in:
Derek Foreman 2016-09-19 10:34:44 -05:00
parent b324b754f3
commit 9799d45ee7
1 changed files with 6 additions and 3 deletions

View File

@ -323,6 +323,7 @@ eina_cpu_map_init(void)
fastest_core_speed = -1;
#if defined (__linux__) || defined(__GLIBC__)
FILE *f = NULL;
Eina_Iterator *it;
Eina_Strbuf *fname;
const Eina_File_Direct_Info *f_info;
@ -339,7 +340,6 @@ eina_cpu_map_init(void)
eina_str_has_prefix(f_info->path,
"/sys/devices/system/cpu/cpufreq/policy"))
{
FILE *f;
int num, speed;
eina_strbuf_append_printf(fname, "%s%s", f_info->path, "/cpuinfo_max_freq");
@ -349,6 +349,7 @@ eina_cpu_map_init(void)
speed = -1;
num = fscanf(f, "%d", &speed);
fclose(f);
f = NULL;
if ((num != 1) || (speed == -1)) goto err;
slowest_core_speed = MIN(speed, slowest_core_speed);
@ -370,15 +371,17 @@ eina_cpu_map_init(void)
{
corelist = malloc(sizeof(*corelist));
if (!corelist) goto err;
*corelist = 1 << core;
*corelist = 1LL << core;
eina_hash_add(cpu_hash, &speed, corelist);
}
*corelist |= 1 << core;
*corelist |= 1LL << core;
} while (num != EOF);
fclose(f);
f = NULL;
}
}
err:
if (f) fclose(f);
eina_strbuf_free(fname);
eina_iterator_free(it);
#endif