From 0883efd92ca4c8ca087f4d05b1ff1b107dbf1e60 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Fri, 9 Nov 2007 17:31:31 +0000 Subject: [PATCH] [SIGAR-72] Fix possible crash parsing /proc/stat:btime --- src/os/linux/linux_sigar.c | 48 ++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/os/linux/linux_sigar.c b/src/os/linux/linux_sigar.c index 3e89fbcf..20adb174 100644 --- a/src/os/linux/linux_sigar.c +++ b/src/os/linux/linux_sigar.c @@ -121,34 +121,52 @@ sigar_pid_t sigar_pid_get(sigar_t *sigar) return sigar->pid; } +static int sigar_boot_time_get(sigar_t *sigar) +{ + FILE *fp; + char buffer[BUFSIZ], *ptr; + int found = 0; + + if (!(fp = fopen(PROC_STAT, "r"))) { + return errno; + } + + while ((ptr = fgets(buffer, sizeof(buffer), fp))) { + if (strnEQ(ptr, "btime", 5)) { + if ((ptr = sigar_skip_token(ptr))) { + sigar->boot_time = sigar_strtoul(ptr); + found = 1; + } + break; + } + } + + if (!found) { + /* should never happen */ + sigar->boot_time = time(NULL); + } + + return SIGAR_OK; +} + int sigar_os_open(sigar_t **sigar) { - char buffer[BUFSIZ], *ptr; - int i; - int status = sigar_file2str(PROC_STAT, buffer, sizeof(buffer)); + int i, status; struct stat sb; *sigar = malloc(sizeof(**sigar)); - if (status != SIGAR_OK) { - return status; - } - (*sigar)->pagesize = 0; i = getpagesize(); while ((i >>= 1) > 0) { (*sigar)->pagesize++; } - if ((ptr = strstr(buffer, "\nbtime"))) { - ptr = sigar_skip_token(ptr); - (*sigar)->boot_time = sigar_strtoul(ptr); + status = sigar_boot_time_get(*sigar); + if (status != SIGAR_OK) { + return status; } - else { - /* should never happen */ - (*sigar)->boot_time = time(NULL); - } - + (*sigar)->ticks = sysconf(_SC_CLK_TCK); (*sigar)->ram = -1;