From 39468cd38feb28e9173b19b17a26419af8129b7c Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 17 Sep 2003 18:49:34 +0000 Subject: (read_utmp): Likewise. Check for fstat error. Close stream and free storage when failing. --- lib/readutmp.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'lib') 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; -- cgit v1.2.3-70-g09d2