Skip to content

Commit

Permalink
Rename the 'flags' argument to getfsstat() to 'mode' and validate it.
Browse files Browse the repository at this point in the history
This argument is not a bitmask of flags, but only accepts a single value.
Fail with EINVAL if an invalid value is passed to 'flag'.  Rename the
'flags' argument to getmntinfo(3) to 'mode' as well to match.

This is a followup to r308088.

Reviewed by:	kib
MFC after:	1 month
  • Loading branch information
bsdjhb committed Dec 27, 2016
1 parent 3a48aeb commit 34ed0c6
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 27 deletions.
6 changes: 3 additions & 3 deletions lib/libc/gen/getmntinfo.3
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
.\" @(#)getmntinfo.3 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
.Dd June 9, 1993
.Dd December 27, 2016
.Dt GETMNTINFO 3
.Os
.Sh NAME
Expand All @@ -41,7 +41,7 @@
.In sys/ucred.h
.In sys/mount.h
.Ft int
.Fn getmntinfo "struct statfs **mntbufp" "int flags"
.Fn getmntinfo "struct statfs **mntbufp" "int mode"
.Sh DESCRIPTION
The
.Fn getmntinfo
Expand All @@ -55,7 +55,7 @@ The
.Fn getmntinfo
function
passes its
.Fa flags
.Fa mode
argument transparently to
.Xr getfsstat 2 .
.Sh RETURN VALUES
Expand Down
6 changes: 3 additions & 3 deletions lib/libc/gen/getmntinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,23 +42,23 @@ __FBSDID("$FreeBSD$");
* Return information about mounted filesystems.
*/
int
getmntinfo(struct statfs **mntbufp, int flags)
getmntinfo(struct statfs **mntbufp, int mode)
{
static struct statfs *mntbuf;
static int mntsize;
static long bufsize;

if (mntsize <= 0 && (mntsize = getfsstat(0, 0, MNT_NOWAIT)) < 0)
return (0);
if (bufsize > 0 && (mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
if (bufsize > 0 && (mntsize = getfsstat(mntbuf, bufsize, mode)) < 0)
return (0);
while (bufsize <= mntsize * sizeof(struct statfs)) {
if (mntbuf)
free(mntbuf);
bufsize = (mntsize + 1) * sizeof(struct statfs);
if ((mntbuf = malloc(bufsize)) == NULL)
return (0);
if ((mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
if ((mntsize = getfsstat(mntbuf, bufsize, mode)) < 0)
return (0);
}
*mntbufp = mntbuf;
Expand Down
14 changes: 10 additions & 4 deletions lib/libc/sys/getfsstat.2
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
.\" @(#)getfsstat.2 8.3 (Berkeley) 5/25/95
.\" $FreeBSD$
.\"
.Dd November 6, 2016
.Dd December 27, 2016
.Dt GETFSSTAT 2
.Os
.Sh NAME
Expand All @@ -41,7 +41,7 @@
.In sys/ucred.h
.In sys/mount.h
.Ft int
.Fn getfsstat "struct statfs *buf" "long bufsize" "int flags"
.Fn getfsstat "struct statfs *buf" "long bufsize" "int mode"
.Sh DESCRIPTION
The
.Fn getfsstat
Expand Down Expand Up @@ -74,11 +74,11 @@ is given as NULL,
returns just the number of mounted file systems.
.Pp
Normally
.Fa flags
.Fa mode
should be specified as
.Dv MNT_WAIT .
If
.Fa flags
.Fa mode
is set to
.Dv MNT_NOWAIT ,
.Fn getfsstat
Expand Down Expand Up @@ -108,6 +108,12 @@ The
.Fa buf
argument
points to an invalid address.
.It Bq Er EINVAL
.Fa mode
is set to a value other than
.Dv MNT_WAIT
or
.Dv MNT_NOWAIT .
.It Bq Er EIO
An
.Tn I/O
Expand Down
2 changes: 1 addition & 1 deletion sys/compat/freebsd32/freebsd32_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ freebsd4_freebsd32_getfsstat(struct thread *td, struct freebsd4_freebsd32_getfss

count = uap->bufsize / sizeof(struct statfs32);
size = count * sizeof(struct statfs);
error = kern_getfsstat(td, &buf, size, &count, UIO_SYSSPACE, uap->flags);
error = kern_getfsstat(td, &buf, size, &count, UIO_SYSSPACE, uap->mode);
if (size > 0) {
sp = buf;
copycount = count;
Expand Down
4 changes: 2 additions & 2 deletions sys/compat/freebsd32/syscalls.master
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
obreak_args int
18 AUE_GETFSSTAT COMPAT4 { int freebsd32_getfsstat( \
struct statfs32 *buf, long bufsize, \
int flags); }
int mode); }
19 AUE_LSEEK COMPAT { int freebsd32_lseek(int fd, int offset, \
int whence); }
20 AUE_GETPID NOPROTO { pid_t getpid(void); }
Expand Down Expand Up @@ -711,7 +711,7 @@
off_t *sbytes, int flags); }
394 AUE_NULL UNIMPL mac_syscall
395 AUE_GETFSSTAT NOPROTO { int getfsstat(struct statfs *buf, \
long bufsize, int flags); }
long bufsize, int mode); }
396 AUE_STATFS NOPROTO { int statfs(char *path, \
struct statfs *buf); }
397 AUE_FSTATFS NOPROTO { int fstatfs(int fd, struct statfs *buf); }
Expand Down
4 changes: 2 additions & 2 deletions sys/kern/syscalls.master
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
17 AUE_NULL STD { int obreak(char *nsize); } break \
obreak_args int
18 AUE_GETFSSTAT COMPAT4 { int getfsstat(struct ostatfs *buf, \
long bufsize, int flags); }
long bufsize, int mode); }
19 AUE_LSEEK COMPAT { long lseek(int fd, long offset, \
int whence); }
20 AUE_GETPID STD { pid_t getpid(void); }
Expand Down Expand Up @@ -706,7 +706,7 @@
394 AUE_NULL STD { int mac_syscall(const char *policy, \
int call, void *arg); }
395 AUE_GETFSSTAT STD { int getfsstat(struct statfs *buf, \
long bufsize, int flags); }
long bufsize, int mode); }
396 AUE_STATFS STD { int statfs(char *path, \
struct statfs *buf); }
397 AUE_FSTATFS STD { int fstatfs(int fd, struct statfs *buf); }
Expand Down
29 changes: 18 additions & 11 deletions sys/kern/vfs_syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ kern_fstatfs(struct thread *td, int fd, struct statfs *buf)
struct getfsstat_args {
struct statfs *buf;
long bufsize;
int flags;
int mode;
};
#endif
int
Expand All @@ -421,7 +421,7 @@ sys_getfsstat(td, uap)
register struct getfsstat_args /* {
struct statfs *buf;
long bufsize;
int flags;
int mode;
} */ *uap;
{
size_t count;
Expand All @@ -430,7 +430,7 @@ sys_getfsstat(td, uap)
if (uap->bufsize < 0 || uap->bufsize > SIZE_MAX)
return (EINVAL);
error = kern_getfsstat(td, &uap->buf, uap->bufsize, &count,
UIO_USERSPACE, uap->flags);
UIO_USERSPACE, uap->mode);
if (error == 0)
td->td_retval[0] = count;
return (error);
Expand All @@ -443,13 +443,20 @@ sys_getfsstat(td, uap)
*/
int
kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
size_t *countp, enum uio_seg bufseg, int flags)
size_t *countp, enum uio_seg bufseg, int mode)
{
struct mount *mp, *nmp;
struct statfs *sfsp, *sp, sb, *tofree;
size_t count, maxcount;
int error;

switch (mode) {
case MNT_WAIT:
case MNT_NOWAIT:
break;
default:
return (EINVAL);
}
restart:
maxcount = bufsize / sizeof(struct statfs);
if (bufsize == 0) {
Expand Down Expand Up @@ -483,7 +490,7 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
continue;
}
#endif
if (flags == MNT_WAIT) {
if (mode == MNT_WAIT) {
if (vfs_busy(mp, MBF_MNTLSTLOCK) != 0) {
/*
* If vfs_busy() failed, and MBF_NOWAIT
Expand Down Expand Up @@ -512,10 +519,10 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
sp->f_namemax = NAME_MAX;
sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
/*
* If MNT_NOWAIT or MNT_LAZY is specified, do not
* refresh the fsstat cache.
* If MNT_NOWAIT is specified, do not refresh
* the fsstat cache.
*/
if (flags != MNT_LAZY && flags != MNT_NOWAIT) {
if (mode != MNT_NOWAIT) {
error = VFS_STATFS(mp, sp);
if (error != 0) {
mtx_lock(&mountlist_mtx);
Expand Down Expand Up @@ -620,7 +627,7 @@ freebsd4_fstatfs(td, uap)
struct freebsd4_getfsstat_args {
struct ostatfs *buf;
long bufsize;
int flags;
int mode;
};
#endif
int
Expand All @@ -629,7 +636,7 @@ freebsd4_getfsstat(td, uap)
register struct freebsd4_getfsstat_args /* {
struct ostatfs *buf;
long bufsize;
int flags;
int mode;
} */ *uap;
{
struct statfs *buf, *sp;
Expand All @@ -644,7 +651,7 @@ freebsd4_getfsstat(td, uap)
return (EINVAL);
size = count * sizeof(struct statfs);
error = kern_getfsstat(td, &buf, size, &count, UIO_SYSSPACE,
uap->flags);
uap->mode);
td->td_retval[0] = count;
if (size != 0) {
sp = buf;
Expand Down
2 changes: 1 addition & 1 deletion sys/sys/syscallsubr.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ int kern_futimens(struct thread *td, int fd, struct timespec *tptr,
int kern_getdirentries(struct thread *td, int fd, char *buf, u_int count,
long *basep, ssize_t *residp, enum uio_seg bufseg);
int kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
size_t *countp, enum uio_seg bufseg, int flags);
size_t *countp, enum uio_seg bufseg, int mode);
int kern_getitimer(struct thread *, u_int, struct itimerval *);
int kern_getppid(struct thread *);
int kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
Expand Down

0 comments on commit 34ed0c6

Please sign in to comment.