From: Alexander Sverdlin Date: Sun, 29 Mar 2015 18:46:42 +0000 (+0200) Subject: systemd-bootchart: Repair Entropy Graph X-Git-Tag: v219.0~219 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=c87664fef45fc1dadc2303675ed357e0dde61db9 systemd-bootchart: Repair Entropy Graph Entropy Graph code doesn't handle the error condition if open() of /proc entry fails. Moreover, the file is only opened once and only first sample will contain the correct value because the return value of pread() is also not handled properly and file is not re-opened. Fix both problems. --- diff --git a/src/bootchart/store.c b/src/bootchart/store.c index 8e9a62f91..fb3dc9ad6 100644 --- a/src/bootchart/store.c +++ b/src/bootchart/store.c @@ -119,7 +119,7 @@ void log_sample(int sample, struct list_sample_data **ptr) { int c; int p; int mod; - static int e_fd; + static int e_fd = -1; ssize_t s; ssize_t n; struct dirent *ent; @@ -215,16 +215,21 @@ schedstat_next: } if (arg_entropy) { - if (!e_fd) { + if (e_fd < 0) { e_fd = openat(procfd, "sys/kernel/random/entropy_avail", O_RDONLY); + if (e_fd == -1) { + log_error_errno(errno, "Failed to open /proc/sys/kernel/random/entropy_avail: %m"); + exit(EXIT_FAILURE); + } } - if (e_fd) { - n = pread(e_fd, buf, sizeof(buf) - 1, 0); - if (n > 0) { - buf[n] = '\0'; - sampledata->entropy_avail = atoi(buf); - } + n = pread(e_fd, buf, sizeof(buf) - 1, 0); + if (n <= 0) { + close(e_fd); + e_fd = -1; + } else { + buf[n] = '\0'; + sampledata->entropy_avail = atoi(buf); } }