diff options
Diffstat (limited to 'lib/readutmp.c')
-rw-r--r-- | lib/readutmp.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/readutmp.c b/lib/readutmp.c index 1a6af083c..941d8c9f4 100644 --- a/lib/readutmp.c +++ b/lib/readutmp.c @@ -104,23 +104,33 @@ read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf) if (utmp == NULL) return 1; - fstat (fileno (utmp), &file_stats); + if (fstat (fileno (utmp), &file_stats) != 0) + { + int e = errno; + fclose (utmp); + errno = e; + return 1; + } size = file_stats.st_size; - if (size > 0) buf = xmalloc (size); - else + n_read = fread (buf, sizeof *buf, size / sizeof *buf, utmp); + if (ferror (utmp)) { + int e = errno; + free (buf); fclose (utmp); + errno = e; return 1; } - - /* Use < instead of != in case the utmp just grew. */ - n_read = fread (buf, 1, size, utmp); - if (ferror (utmp) || fclose (utmp) == EOF - || n_read < size) + if (fclose (utmp) != 0) + { + int e = errno; + free (buf); + errno = e; return 1; + } - *n_entries = size / sizeof (STRUCT_UTMP); + *n_entries = n_read; *utmp_buf = buf; return 0; |