(read_utmp): Likewise.
authorJim Meyering <jim@meyering.net>
Wed, 17 Sep 2003 18:49:34 +0000 (18:49 +0000)
committerJim Meyering <jim@meyering.net>
Wed, 17 Sep 2003 18:49:34 +0000 (18:49 +0000)
Check for fstat error.  Close stream and free storage when failing.

lib/readutmp.c

index 1a6af08..941d8c9 100644 (file)
@@ -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;