changeset 4287:0c926607b93d

Merge change from Coreutils. (read_filesystem_list) [MOUNTED_VMOUNT]: Detect any error from mntctl. Use mntctl's return value to drive the entry-processing loop, since we can't rely on the value of the vmt_length member in the last entry. On some systems doing so could result in exhausting virtual memory. Based in part on a patch from Mike Jetzer.
author Jim Meyering <jim@meyering.net>
date Sat, 05 Apr 2003 06:46:00 +0000
parents 30efb146649e
children 4e7deb01d237
files lib/mountlist.c
diffstat 1 files changed, 16 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -1,5 +1,5 @@
 /* mountlist.c -- return a list of mounted filesystems
-   Copyright (C) 1991, 1992, 1997-2002 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1992, 1997-2003 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -730,16 +730,27 @@
     int bufsize;
     char *entries, *thisent;
     struct vmount *vmp;
+    int n_entries;
+    int i;
 
     /* Ask how many bytes to allocate for the mounted filesystem info.  */
-    mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize);
+    if (mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize) != 0)
+      return NULL;
     entries = xmalloc (bufsize);
 
     /* Get the list of mounted filesystems.  */
-    mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
+    n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
+    if (n_entries < 0)
+      {
+	int saved_errno = errno;
+	free (entries);
+	errno = saved_errno;
+	return NULL;
+      }
 
-    for (thisent = entries; thisent < entries + bufsize;
-	 thisent += vmp->vmt_length)
+    for (i = 0, thisent = entries;
+	 i < n_entries;
+	 i++, thisent += vmp->vmt_length)
       {
 	char *options, *ignore;