Module Name: src Committed By: martin Date: Sun Aug 15 09:27:50 UTC 2021
Modified Files: src/sys/compat/common [netbsd-9]: vfs_syscalls_30.c vfs_syscalls_43.c vfs_syscalls_50.c Log Message: Pull up following revision(s) (requested by christos in ticket #1337): sys/compat/common/vfs_syscalls_43.c: revision 1.67 sys/compat/common/vfs_syscalls_50.c: revision 1.26 sys/compat/common/vfs_syscalls_30.c: revision 1.42 - memset struct stat to avoid kernel memory disclosure of padded fields (thanks Trend Micro for the report) - use do_fhstat - consistency in argument order of compat functions To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.38.4.1 src/sys/compat/common/vfs_syscalls_30.c cvs rdiff -u -r1.64.4.1 -r1.64.4.2 src/sys/compat/common/vfs_syscalls_43.c cvs rdiff -u -r1.23.2.1 -r1.23.2.2 src/sys/compat/common/vfs_syscalls_50.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/common/vfs_syscalls_30.c diff -u src/sys/compat/common/vfs_syscalls_30.c:1.38 src/sys/compat/common/vfs_syscalls_30.c:1.38.4.1 --- src/sys/compat/common/vfs_syscalls_30.c:1.38 Sun Jan 27 02:08:39 2019 +++ src/sys/compat/common/vfs_syscalls_30.c Sun Aug 15 09:27:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls_30.c,v 1.38 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: vfs_syscalls_30.c,v 1.38.4.1 2021/08/15 09:27:50 martin Exp $ */ /*- * Copyright (c) 2005, 2008 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.38 2019/01/27 02:08:39 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.38.4.1 2021/08/15 09:27:50 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -61,8 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_syscalls #include <compat/sys/dirent.h> #include <compat/sys/mount.h> -static void cvtstat(struct stat13 *, const struct stat *); - static const struct syscall_package vfs_syscalls_30_syscalls[] = { { SYS_compat_30___fhstat30, 0, (sy_call_t *)compat_30_sys___fhstat30 }, { SYS_compat_30___fstat13, 0, (sy_call_t *)compat_30_sys___fstat13 }, @@ -83,6 +81,8 @@ static void cvtstat(struct stat13 *ost, const struct stat *st) { + /* Handle any padding. */ + memset(ost, 0, sizeof(*ost)); ost->st_dev = st->st_dev; ost->st_ino = (uint32_t)st->st_ino; ost->st_mode = st->st_mode; @@ -121,8 +121,7 @@ compat_30_sys___stat13(struct lwp *l, if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, ub), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, ub), sizeof(osb)); } @@ -146,8 +145,7 @@ compat_30_sys___lstat13(struct lwp *l, if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, ub), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, ub), sizeof(osb)); } /* ARGSUSED */ @@ -162,33 +160,12 @@ compat_30_sys_fhstat(struct lwp *l, struct stat sb; struct stat13 osb; int error; - struct compat_30_fhandle fh; - struct mount *mp; - struct vnode *vp; - - /* - * Must be super user - */ - if ((error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_FILEHANDLE, - 0, NULL, NULL, NULL))) - return (error); - if ((error = copyin(SCARG(uap, fhp), &fh, sizeof(fh))) != 0) - return (error); - - if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL) - return (ESTALE); - if (mp->mnt_op->vfs_fhtovp == NULL) - return EOPNOTSUPP; - if ((error = VFS_FHTOVP(mp, (struct fid*)&fh.fh_fid, &vp))) - return (error); - error = vn_stat(vp, &sb); - vput(vp); + error = do_fhstat(l, SCARG(uap, fhp), sizeof(*SCARG(uap, fhp)), &sb); if (error) - return (error); + return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, sb), sizeof(sb)); - return (error); + return copyout(&osb, SCARG(uap, sb), sizeof(osb)); } /* @@ -211,8 +188,7 @@ compat_30_sys___fstat13(struct lwp *l, if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, sb), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, sb), sizeof(osb)); } /* @@ -289,7 +265,7 @@ again: bdp = (struct dirent *)inp; reclen = bdp->d_reclen; if (reclen & _DIRENT_ALIGN(bdp)) - panic("netbsd30_getdents: bad reclen %d", reclen); + panic("%s: bad reclen %d", __func__, reclen); if (cookie) off = *cookie++; /* each entry points to the next */ else @@ -393,9 +369,8 @@ compat_30_sys_getfh(struct lwp *l, const error = EINVAL; } if (error) - return (error); - error = copyout(&fh, SCARG(uap, fhp), sizeof(struct compat_30_fhandle)); - return (error); + return error; + return copyout(&fh, SCARG(uap, fhp), sizeof(fh)); } /* @@ -434,8 +409,7 @@ compat_30_sys___fhstat30(struct lwp *l, if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap_30, sb), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap_30, sb), sizeof(osb)); } /* ARGSUSED */ Index: src/sys/compat/common/vfs_syscalls_43.c diff -u src/sys/compat/common/vfs_syscalls_43.c:1.64.4.1 src/sys/compat/common/vfs_syscalls_43.c:1.64.4.2 --- src/sys/compat/common/vfs_syscalls_43.c:1.64.4.1 Thu Feb 27 19:00:05 2020 +++ src/sys/compat/common/vfs_syscalls_43.c Sun Aug 15 09:27:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls_43.c,v 1.64.4.1 2020/02/27 19:00:05 martin Exp $ */ +/* $NetBSD: vfs_syscalls_43.c,v 1.64.4.2 2021/08/15 09:27:50 martin Exp $ */ /* * Copyright (c) 1989, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_43.c,v 1.64.4.1 2020/02/27 19:00:05 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_43.c,v 1.64.4.2 2021/08/15 09:27:50 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -75,9 +75,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_syscalls #include <compat/common/compat_util.h> #include <compat/common/compat_mod.h> -static void cvttimespec(struct timespec *, struct timespec50 *); -static void cvtstat(struct stat *, struct stat43 *); - static struct syscall_package vfs_syscalls_43_syscalls[] = { { SYS_compat_43_oquota, 0, (sy_call_t *)compat_43_sys_quota }, { SYS_compat_43_stat43, 0, (sy_call_t *)compat_43_sys_stat }, @@ -96,7 +93,7 @@ static struct syscall_package vfs_syscal * Convert from an old to a new timespec structure. */ static void -cvttimespec(struct timespec *ts, struct timespec50 *ots) +cvttimespec(struct timespec50 *ots, const struct timespec *ts) { if (ts->tv_sec > INT_MAX) { @@ -120,11 +117,11 @@ cvttimespec(struct timespec *ts, struct * Convert from an old to a new stat structure. */ static void -cvtstat(struct stat *st, struct stat43 *ost) +cvtstat(struct stat43 *ost, const struct stat *st) { /* Handle any padding. */ - memset(ost, 0, sizeof *ost); + memset(ost, 0, sizeof(*ost)); ost->st_dev = st->st_dev; ost->st_ino = st->st_ino; ost->st_mode = st->st_mode & 0xffff; @@ -136,9 +133,9 @@ cvtstat(struct stat *st, struct stat43 * ost->st_size = st->st_size; else ost->st_size = -2; - cvttimespec(&st->st_atimespec, &ost->st_atimespec); - cvttimespec(&st->st_mtimespec, &ost->st_mtimespec); - cvttimespec(&st->st_ctimespec, &ost->st_ctimespec); + cvttimespec(&ost->st_atimespec, &st->st_atimespec); + cvttimespec(&ost->st_mtimespec, &st->st_mtimespec); + cvttimespec(&ost->st_ctimespec, &st->st_ctimespec); ost->st_blksize = st->st_blksize; ost->st_blocks = st->st_blocks; ost->st_flags = st->st_flags; @@ -162,10 +159,9 @@ compat_43_sys_stat(struct lwp *l, const error = do_sys_stat(SCARG(uap, path), FOLLOW, &sb); if (error) - return (error); - cvtstat(&sb, &osb); - error = copyout((void *)&osb, (void *)SCARG(uap, ub), sizeof (osb)); - return (error); + return error; + cvtstat(&osb, &sb); + return copyout(&osb, SCARG(uap, ub), sizeof(osb)); } /* @@ -177,7 +173,7 @@ compat_43_sys_lstat(struct lwp *l, const { /* { syscallarg(char *) path; - syscallarg(struct ostat *) ub; + syscallarg(struct stat43 *) ub; } */ struct vnode *vp, *dvp; struct stat sb, sb1; @@ -242,9 +238,8 @@ again: sb.st_size = sb1.st_size; sb.st_blocks = sb1.st_blocks; } - cvtstat(&sb, &osb); - error = copyout((void *)&osb, (void *)SCARG(uap, ub), sizeof (osb)); - return (error); + cvtstat(&osb, &sb); + return copyout((void *)&osb, (void *)SCARG(uap, ub), sizeof (osb)); } /* @@ -258,18 +253,16 @@ compat_43_sys_fstat(struct lwp *l, const syscallarg(int) fd; syscallarg(struct stat43 *) sb; } */ - struct stat ub; - struct stat43 oub; + struct stat sb; + struct stat43 osb; int error; - error = do_sys_fstat(SCARG(uap, fd), &ub); - if (error == 0) { - cvtstat(&ub, &oub); - error = copyout((void *)&oub, (void *)SCARG(uap, sb), - sizeof (oub)); - } + error = do_sys_fstat(SCARG(uap, fd), &sb); + if (error) + return error; - return (error); + cvtstat(&osb, &sb); + return copyout(&osb, SCARG(uap, sb), sizeof(osb)); } @@ -292,7 +285,7 @@ compat_43_sys_ftruncate(struct lwp *l, c SCARG(&nuap, fd) = SCARG(uap, fd); SCARG(&nuap, length) = SCARG(uap, length); - return (sys_ftruncate(l, &nuap, retval)); + return sys_ftruncate(l, &nuap, retval); } /* @@ -531,7 +524,7 @@ out1: fd_putfile(SCARG(uap, fd)); if (error) return error; - return copyout(&loff, SCARG(uap, basep), sizeof(long)); + return copyout(&loff, SCARG(uap, basep), sizeof(loff)); } int Index: src/sys/compat/common/vfs_syscalls_50.c diff -u src/sys/compat/common/vfs_syscalls_50.c:1.23.2.1 src/sys/compat/common/vfs_syscalls_50.c:1.23.2.2 --- src/sys/compat/common/vfs_syscalls_50.c:1.23.2.1 Wed Dec 18 20:04:32 2019 +++ src/sys/compat/common/vfs_syscalls_50.c Sun Aug 15 09:27:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls_50.c,v 1.23.2.1 2019/12/18 20:04:32 martin Exp $ */ +/* $NetBSD: vfs_syscalls_50.c,v 1.23.2.2 2021/08/15 09:27:50 martin Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_50.c,v 1.23.2.1 2019/12/18 20:04:32 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_50.c,v 1.23.2.2 2021/08/15 09:27:50 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -75,8 +75,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_syscalls #include <compat/sys/dirent.h> #include <compat/sys/mount.h> -static void cvtstat(struct stat30 *, const struct stat *); - static const struct syscall_package vfs_syscalls_50_syscalls[] = { { SYS_compat_50___stat30, 0, (sy_call_t *)compat_50_sys___stat30 }, { SYS_compat_50___fstat30, 0, (sy_call_t *)compat_50_sys___fstat30 }, @@ -101,6 +99,8 @@ static void cvtstat(struct stat30 *ost, const struct stat *st) { + /* Handle any padding. */ + memset(ost, 0, sizeof(*ost)); ost->st_dev = st->st_dev; ost->st_ino = st->st_ino; ost->st_mode = st->st_mode; @@ -139,8 +139,7 @@ compat_50_sys___stat30(struct lwp *l, co if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, ub), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, ub), sizeof(osb)); } @@ -163,8 +162,7 @@ compat_50_sys___lstat30(struct lwp *l, c if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, ub), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, ub), sizeof(osb)); } /* @@ -186,8 +184,7 @@ compat_50_sys___fstat30(struct lwp *l, c if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, sb), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, sb), sizeof(osb)); } /* ARGSUSED */ @@ -207,8 +204,7 @@ compat_50_sys___fhstat40(struct lwp *l, if (error) return error; cvtstat(&osb, &sb); - error = copyout(&osb, SCARG(uap, sb), sizeof (osb)); - return error; + return copyout(&osb, SCARG(uap, sb), sizeof(osb)); } static int