diff options
author | Jim Meyering <jim@meyering.net> | 2003-03-18 17:47:06 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-03-18 17:47:06 +0000 |
commit | 081b3c96efe7d0b21b79793c3b0bf67a8d4b38e2 (patch) | |
tree | 4069e61739ab76f0bab020b582a59ea77552c422 | |
parent | f36cebb7df88b00a99e2e9aa687cb5eefe61c927 (diff) | |
download | coreutils-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.c | 21 |
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; |