Module Name: src
Committed By: elad
Date: Thu May 7 19:30:31 UTC 2009
Modified Files:
src/sys/fs/msdosfs: msdosfs_vnops.c
src/sys/fs/ptyfs: ptyfs_vnops.c
src/sys/fs/smbfs: smbfs_vnops.c
src/sys/fs/tmpfs: tmpfs_subr.c
src/sys/fs/udf: udf_vnops.c
src/sys/miscfs/genfs: genfs.h genfs_vnops.c
src/sys/ufs/ext2fs: ext2fs_vnops.c
src/sys/ufs/ufs: ufs_vnops.c
Log Message:
Extract the open-coded authorization logic for chtimes() from various
file-systems and put it in a single function, genfs_can_chtimes().
This also makes UDF follow the same policy as all other file-systems.
Mailing list reference:
http://mail-index.netbsd.org/tech-kern/2009/04/27/msg004951.html
To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/fs/msdosfs/msdosfs_vnops.c
cvs rdiff -u -r1.29 -r1.30 src/sys/fs/ptyfs/ptyfs_vnops.c
cvs rdiff -u -r1.66 -r1.67 src/sys/fs/smbfs/smbfs_vnops.c
cvs rdiff -u -r1.52 -r1.53 src/sys/fs/tmpfs/tmpfs_subr.c
cvs rdiff -u -r1.40 -r1.41 src/sys/fs/udf/udf_vnops.c
cvs rdiff -u -r1.25 -r1.26 src/sys/miscfs/genfs/genfs.h
cvs rdiff -u -r1.170 -r1.171 src/sys/miscfs/genfs/genfs_vnops.c
cvs rdiff -u -r1.85 -r1.86 src/sys/ufs/ext2fs/ext2fs_vnops.c
cvs rdiff -u -r1.175 -r1.176 src/sys/ufs/ufs/ufs_vnops.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/fs/msdosfs/msdosfs_vnops.c
diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.58 src/sys/fs/msdosfs/msdosfs_vnops.c:1.59
--- src/sys/fs/msdosfs/msdosfs_vnops.c:1.58 Sat Mar 14 21:04:23 2009
+++ src/sys/fs/msdosfs/msdosfs_vnops.c Thu May 7 19:30:31 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_vnops.c,v 1.58 2009/03/14 21:04:23 dsl Exp $ */
+/* $NetBSD: msdosfs_vnops.c,v 1.59 2009/05/07 19:30:31 elad Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.58 2009/03/14 21:04:23 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.59 2009/05/07 19:30:31 elad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -377,11 +377,9 @@
if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) {
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);
- if (kauth_cred_geteuid(cred) != pmp->pm_uid &&
- (error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER,
- NULL)) &&
- ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(ap->a_vp, VWRITE, cred))))
+ error = genfs_can_chtimes(ap->a_vp, vap->va_vaflags,
+ pmp->pm_uid, cred);
+ if (error)
return (error);
if ((pmp->pm_flags & MSDOSFSMNT_NOWIN95) == 0 &&
vap->va_atime.tv_sec != VNOVAL)
Index: src/sys/fs/ptyfs/ptyfs_vnops.c
diff -u src/sys/fs/ptyfs/ptyfs_vnops.c:1.29 src/sys/fs/ptyfs/ptyfs_vnops.c:1.30
--- src/sys/fs/ptyfs/ptyfs_vnops.c:1.29 Wed Apr 22 22:57:09 2009
+++ src/sys/fs/ptyfs/ptyfs_vnops.c Thu May 7 19:30:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: ptyfs_vnops.c,v 1.29 2009/04/22 22:57:09 elad Exp $ */
+/* $NetBSD: ptyfs_vnops.c,v 1.30 2009/05/07 19:30:29 elad Exp $ */
/*
* Copyright (c) 1993, 1995
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ptyfs_vnops.c,v 1.29 2009/04/22 22:57:09 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ptyfs_vnops.c,v 1.30 2009/05/07 19:30:29 elad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -419,11 +419,9 @@
return EROFS;
if ((ptyfs->ptyfs_flags & SF_SNAPSHOT) != 0)
return EPERM;
- if (kauth_cred_geteuid(cred) != ptyfs->ptyfs_uid &&
- (error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER,
- NULL)) &&
- ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(vp, VWRITE, cred)) != 0))
+ error = genfs_can_chtimes(vp, vap->va_vaflags, ptyfs->ptyfs_uid,
+ cred);
+ if (error)
return (error);
if (vap->va_atime.tv_sec != VNOVAL)
if (!(vp->v_mount->mnt_flag & MNT_NOATIME))
Index: src/sys/fs/smbfs/smbfs_vnops.c
diff -u src/sys/fs/smbfs/smbfs_vnops.c:1.66 src/sys/fs/smbfs/smbfs_vnops.c:1.67
--- src/sys/fs/smbfs/smbfs_vnops.c:1.66 Sat Mar 14 21:04:24 2009
+++ src/sys/fs/smbfs/smbfs_vnops.c Thu May 7 19:30:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: smbfs_vnops.c,v 1.66 2009/03/14 21:04:24 dsl Exp $ */
+/* $NetBSD: smbfs_vnops.c,v 1.67 2009/05/07 19:30:30 elad Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.66 2009/03/14 21:04:24 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.67 2009/05/07 19:30:30 elad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -436,13 +436,10 @@
if (vap->va_atime.tv_sec != VNOVAL)
atime = &vap->va_atime;
if (mtime != atime) {
- if (kauth_cred_geteuid(ap->a_cred) !=
- VTOSMBFS(vp)->sm_args.uid &&
- (error = kauth_authorize_generic(ap->a_cred,
- KAUTH_GENERIC_ISSUSER, NULL)) &&
- ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(ap->a_vp, VWRITE, ap->a_cred))))
- return (error);
+ error = genfs_can_chtimes(ap->a_vp, vap->va_vaflags,
+ VTOSMBFS(vp)->sm_args.uid, ap->a_cred);
+ if (error)
+ return (error);
#if 0
if (mtime == NULL)
Index: src/sys/fs/tmpfs/tmpfs_subr.c
diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.52 src/sys/fs/tmpfs/tmpfs_subr.c:1.53
--- src/sys/fs/tmpfs/tmpfs_subr.c:1.52 Wed Apr 22 22:57:09 2009
+++ src/sys/fs/tmpfs/tmpfs_subr.c Thu May 7 19:30:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_subr.c,v 1.52 2009/04/22 22:57:09 elad Exp $ */
+/* $NetBSD: tmpfs_subr.c,v 1.53 2009/05/07 19:30:30 elad Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.52 2009/04/22 22:57:09 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.53 2009/05/07 19:30:30 elad Exp $");
#include <sys/param.h>
#include <sys/dirent.h>
@@ -55,6 +55,7 @@
#include <uvm/uvm.h>
#include <miscfs/specfs/specdev.h>
+#include <miscfs/genfs/genfs.h>
#include <fs/tmpfs/tmpfs.h>
#include <fs/tmpfs/tmpfs_fifoops.h>
#include <fs/tmpfs/tmpfs_specops.h>
@@ -1184,14 +1185,9 @@
if (node->tn_flags & (IMMUTABLE | APPEND))
return EPERM;
- /* XXX: The following comes from UFS code, and can be found in
- * several other file systems. Shouldn't this be centralized
- * somewhere? */
- if (kauth_cred_geteuid(cred) != node->tn_uid &&
- (error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER,
- NULL)) && ((vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(vp, VWRITE, cred))))
- return error;
+ error = genfs_can_chtimes(vp, vaflags, node->tn_uid, cred);
+ if (error)
+ return (error);
if (atime->tv_sec != VNOVAL && atime->tv_nsec != VNOVAL)
node->tn_status |= TMPFS_NODE_ACCESSED;
Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.40 src/sys/fs/udf/udf_vnops.c:1.41
--- src/sys/fs/udf/udf_vnops.c:1.40 Wed Apr 22 22:57:09 2009
+++ src/sys/fs/udf/udf_vnops.c Thu May 7 19:30:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.40 2009/04/22 22:57:09 elad Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.41 2009/05/07 19:30:30 elad Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.40 2009/04/22 22:57:09 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.41 2009/05/07 19:30:30 elad Exp $");
#endif /* not lint */
@@ -1087,9 +1087,8 @@
kauth_cred_t cred)
{
struct udf_node *udf_node = VTOI(vp);
- uid_t euid, uid;
+ uid_t uid;
gid_t gid;
- int issuperuser;
int error;
#ifdef notyet
@@ -1106,19 +1105,9 @@
udf_getownership(udf_node, &uid, &gid);
/* check permissions */
- euid = kauth_cred_geteuid(cred);
- error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, NULL);
- issuperuser = (error == 0);
-
- if (!issuperuser) {
- if (euid != uid)
- return EPERM;
- if ((setattrflags & VA_UTIMES_NULL) == 0) {
- error = VOP_ACCESS(vp, VWRITE, cred);
- if (error)
- return error;
- }
- }
+ error = genfs_can_chtimes(vp, setattrflags, uid, cred);
+ if (error)
+ return (error);
/* update node flags depending on what times are passed */
if (atime->tv_sec != VNOVAL)
Index: src/sys/miscfs/genfs/genfs.h
diff -u src/sys/miscfs/genfs/genfs.h:1.25 src/sys/miscfs/genfs/genfs.h:1.26
--- src/sys/miscfs/genfs/genfs.h:1.25 Sat Apr 25 18:53:44 2009
+++ src/sys/miscfs/genfs/genfs.h Thu May 7 19:30:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: genfs.h,v 1.25 2009/04/25 18:53:44 elad Exp $ */
+/* $NetBSD: genfs.h,v 1.26 2009/05/07 19:30:29 elad Exp $ */
#ifndef _MISCFS_GENFS_GENFS_H_
#define _MISCFS_GENFS_GENFS_H_
@@ -39,5 +39,6 @@
int genfs_can_chmod(vnode_t *, kauth_cred_t, uid_t, gid_t, mode_t);
int genfs_can_chown(vnode_t *, kauth_cred_t, uid_t, gid_t, uid_t, gid_t);
int genfs_can_mount(vnode_t *, mode_t, kauth_cred_t);
+int genfs_can_chtimes(vnode_t *, u_int, uid_t, kauth_cred_t);
#endif /* !_MISCFS_GENFS_GENFS_H_ */
Index: src/sys/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.170 src/sys/miscfs/genfs/genfs_vnops.c:1.171
--- src/sys/miscfs/genfs/genfs_vnops.c:1.170 Sat Apr 25 18:53:44 2009
+++ src/sys/miscfs/genfs/genfs_vnops.c Thu May 7 19:30:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: genfs_vnops.c,v 1.170 2009/04/25 18:53:44 elad Exp $ */
+/* $NetBSD: genfs_vnops.c,v 1.171 2009/05/07 19:30:29 elad Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.170 2009/04/25 18:53:44 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.171 2009/05/07 19:30:29 elad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -665,3 +665,31 @@
return (error);
}
+
+int
+genfs_can_chtimes(vnode_t *vp, u_int vaflags, uid_t owner_uid,
+ kauth_cred_t cred)
+{
+ int error;
+
+ /* Must be root, or... */
+ error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER, NULL);
+ if (!error)
+ return (0);
+
+ /* must be owner, or... */
+ if (kauth_cred_geteuid(cred) == owner_uid)
+ return (0);
+
+ /* set the times to the current time, and... */
+ if ((vaflags & VA_UTIMES_NULL) == 0)
+ return (EPERM);
+
+ /* have write access. */
+ error = VOP_ACCESS(vp, VWRITE, cred);
+ if (error)
+ return (error);
+
+ return (0);
+}
+
Index: src/sys/ufs/ext2fs/ext2fs_vnops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.85 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.86
--- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.85 Wed Apr 22 22:57:09 2009
+++ src/sys/ufs/ext2fs/ext2fs_vnops.c Thu May 7 19:30:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vnops.c,v 1.85 2009/04/22 22:57:09 elad Exp $ */
+/* $NetBSD: ext2fs_vnops.c,v 1.86 2009/05/07 19:30:30 elad Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.85 2009/04/22 22:57:09 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.86 2009/05/07 19:30:30 elad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -408,11 +408,8 @@
if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) {
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);
- if (kauth_cred_geteuid(cred) != ip->i_uid &&
- (error = kauth_authorize_generic(cred, KAUTH_GENERIC_ISSUSER,
- NULL)) &&
- ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(vp, VWRITE, cred))))
+ error = genfs_can_chtimes(vp, vap->va_vaflags, ip->i_uid, cred);
+ if (error)
return (error);
if (vap->va_atime.tv_sec != VNOVAL)
if (!(vp->v_mount->mnt_flag & MNT_NOATIME))
Index: src/sys/ufs/ufs/ufs_vnops.c
diff -u src/sys/ufs/ufs/ufs_vnops.c:1.175 src/sys/ufs/ufs/ufs_vnops.c:1.176
--- src/sys/ufs/ufs/ufs_vnops.c:1.175 Wed Apr 22 22:57:09 2009
+++ src/sys/ufs/ufs/ufs_vnops.c Thu May 7 19:30:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_vnops.c,v 1.175 2009/04/22 22:57:09 elad Exp $ */
+/* $NetBSD: ufs_vnops.c,v 1.176 2009/05/07 19:30:30 elad Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.175 2009/04/22 22:57:09 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.176 2009/05/07 19:30:30 elad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -585,12 +585,9 @@
error = EPERM;
goto out;
}
- if (kauth_cred_geteuid(cred) != ip->i_uid &&
- (error = kauth_authorize_generic(cred,
- KAUTH_GENERIC_ISSUSER, NULL)) &&
- ((vap->va_vaflags & VA_UTIMES_NULL) == 0 ||
- (error = VOP_ACCESS(vp, VWRITE, cred))))
- goto out;
+ error = genfs_can_chtimes(vp, vap->va_vaflags, ip->i_uid, cred);
+ if (error)
+ return (error);
error = UFS_WAPBL_BEGIN(vp->v_mount);
if (error)
goto out;