diff options
author | Jim Meyering <jim@meyering.net> | 2003-09-17 18:49:34 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-09-17 18:49:34 +0000 |
commit | 39468cd38feb28e9173b19b17a26419af8129b7c (patch) | |
tree | 197dc9e8a1bb9f2c26512feca8eede621d1613ba /lib | |
parent | 651fd58f8fefec46eec1831f7d7ca8f78718b449 (diff) | |
download | coreutils-39468cd38feb28e9173b19b17a26419af8129b7c.tar.xz |
(read_utmp): Likewise.
Check for fstat error. Close stream and free storage when failing.
Diffstat (limited to 'lib')
-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; |