summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2003-03-18 17:47:06 +0000
committerJim Meyering <jim@meyering.net>2003-03-18 17:47:06 +0000
commit081b3c96efe7d0b21b79793c3b0bf67a8d4b38e2 (patch)
tree4069e61739ab76f0bab020b582a59ea77552c422
parentf36cebb7df88b00a99e2e9aa687cb5eefe61c927 (diff)
downloadcoreutils-081b3c96efe7d0b21b79793c3b0bf67a8d4b38e2.tar.xz
(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 an infinite loop. Based in part on a patch from Mike Jetzer.
-rw-r--r--lib/mountlist.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/mountlist.c b/lib/mountlist.c
index f62a6e788..ca1100f43 100644
--- 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 @@ read_filesystem_list (int need_fs_type)
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;