From b0c5e620359898f3c0f1c9fa92a6fd0e34b7b769 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sat, 2 Mar 2013 01:44:31 +0100 Subject: [PATCH] linux: make uv_cpu_info() handle absent procfs Return an error when reading from /proc files fails because the procfs isn't mounted. This is a back-port of commit 7e59f9b from the master branch. --- src/unix/linux/linux-core.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/unix/linux/linux-core.c b/src/unix/linux/linux-core.c index 4259d171..a2387dab 100644 --- a/src/unix/linux/linux-core.c +++ b/src/unix/linux/linux-core.c @@ -64,9 +64,9 @@ static struct { size_t len; } process_title; -static void read_models(unsigned int numcpus, uv_cpu_info_t* ci); +static int read_models(unsigned int numcpus, uv_cpu_info_t* ci); +static int read_times(unsigned int numcpus, uv_cpu_info_t* ci); static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); -static void read_times(unsigned int numcpus, uv_cpu_info_t* ci); static unsigned long read_cpufreq(unsigned int cpunum); @@ -325,10 +325,19 @@ uv_err_t uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { if (ci == NULL) return uv__new_sys_error(ENOMEM); - read_models(numcpus, ci); - read_times(numcpus, ci); + if (read_models(numcpus, ci)) { + SAVE_ERRNO(free(ci)); + return uv__new_sys_error(errno); + } - /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo */ + if (read_times(numcpus, ci)) { + SAVE_ERRNO(free(ci)); + return uv__new_sys_error(errno); + } + + /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo. + * We don't check for errors here. Worst case, the field is left zero. + */ if (ci[0].speed == 0) read_speeds(numcpus, ci); @@ -350,7 +359,7 @@ static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci) { /* Also reads the CPU frequency on x86. The other architectures only have * a BogoMIPS field, which may not be very accurate. */ -static void read_models(unsigned int numcpus, uv_cpu_info_t* ci) { +static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { #if defined(__i386__) || defined(__x86_64__) static const char model_marker[] = "model name\t: "; static const char speed_marker[] = "cpu MHz\t\t: "; @@ -373,7 +382,7 @@ static void read_models(unsigned int numcpus, uv_cpu_info_t* ci) { fp = fopen("/proc/cpuinfo", "r"); if (fp == NULL) - return; + return -1; model_idx = 0; speed_idx = 0; @@ -398,10 +407,12 @@ static void read_models(unsigned int numcpus, uv_cpu_info_t* ci) { } } fclose(fp); + + return 0; } -static void read_times(unsigned int numcpus, uv_cpu_info_t* ci) { +static int read_times(unsigned int numcpus, uv_cpu_info_t* ci) { unsigned long clock_ticks; struct uv_cpu_times_s ts; unsigned long user; @@ -421,7 +432,7 @@ static void read_times(unsigned int numcpus, uv_cpu_info_t* ci) { fp = fopen("/proc/stat", "r"); if (fp == NULL) - return; + return -1; if (!fgets(buf, sizeof(buf), fp)) abort(); @@ -466,6 +477,8 @@ static void read_times(unsigned int numcpus, uv_cpu_info_t* ci) { ci[num++].cpu_times = ts; } fclose(fp); + + return 0; }