Module Name: src
Committed By: christos
Date: Sun Mar 27 16:24:59 UTC 2022
Modified Files:
src/sys/coda: coda_vnops.c
src/sys/fs/tmpfs: tmpfs_vnops.c
src/sys/fs/udf: udf_vnops.c
src/sys/fs/v7fs: v7fs_vnops.c
src/sys/nfs: nfs_vnops.c
src/sys/ufs/chfs: chfs_vnops.c
src/sys/ufs/ext2fs: ext2fs_vnops.c
src/sys/ufs/lfs: ulfs_vnops.c
src/sys/ufs/ufs: ufs_vnops.c
Log Message:
add a kauth vnode check for creating links
To generate a diff of this commit:
cvs rdiff -u -r1.117 -r1.118 src/sys/coda/coda_vnops.c
cvs rdiff -u -r1.148 -r1.149 src/sys/fs/tmpfs/tmpfs_vnops.c
cvs rdiff -u -r1.119 -r1.120 src/sys/fs/udf/udf_vnops.c
cvs rdiff -u -r1.34 -r1.35 src/sys/fs/v7fs/v7fs_vnops.c
cvs rdiff -u -r1.321 -r1.322 src/sys/nfs/nfs_vnops.c
cvs rdiff -u -r1.47 -r1.48 src/sys/ufs/chfs/chfs_vnops.c
cvs rdiff -u -r1.136 -r1.137 src/sys/ufs/ext2fs/ext2fs_vnops.c
cvs rdiff -u -r1.55 -r1.56 src/sys/ufs/lfs/ulfs_vnops.c
cvs rdiff -u -r1.261 -r1.262 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/coda/coda_vnops.c
diff -u src/sys/coda/coda_vnops.c:1.117 src/sys/coda/coda_vnops.c:1.118
--- src/sys/coda/coda_vnops.c:1.117 Sun Dec 5 03:10:39 2021
+++ src/sys/coda/coda_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: coda_vnops.c,v 1.117 2021/12/05 08:10:39 msaitoh Exp $ */
+/* $NetBSD: coda_vnops.c,v 1.118 2022/03/27 16:24:58 christos Exp $ */
/*
*
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.117 2021/12/05 08:10:39 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.118 2022/03/27 16:24:58 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1198,6 +1198,10 @@ coda_link(void *v)
error = EFAULT; /* XXX better value */
goto exit;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto exit;
error = venus_link(vtomi(vp), &cp->c_fid, &dcp->c_fid, nm, len, cred, l);
VOP_UNLOCK(vp);
Index: src/sys/fs/tmpfs/tmpfs_vnops.c
diff -u src/sys/fs/tmpfs/tmpfs_vnops.c:1.148 src/sys/fs/tmpfs/tmpfs_vnops.c:1.149
--- src/sys/fs/tmpfs/tmpfs_vnops.c:1.148 Tue Oct 19 23:08:17 2021
+++ src/sys/fs/tmpfs/tmpfs_vnops.c Sun Mar 27 12:24:57 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_vnops.c,v 1.148 2021/10/20 03:08:17 thorpej Exp $ */
+/* $NetBSD: tmpfs_vnops.c,v 1.149 2022/03/27 16:24:57 christos Exp $ */
/*
* Copyright (c) 2005, 2006, 2007, 2020 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.148 2021/10/20 03:08:17 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.149 2022/03/27 16:24:57 christos Exp $");
#include <sys/param.h>
#include <sys/dirent.h>
@@ -801,6 +801,11 @@ tmpfs_link(void *v)
goto out;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto out;
+
/* Allocate a new directory entry to represent the inode. */
error = tmpfs_alloc_dirent(VFS_TO_TMPFS(vp->v_mount),
cnp->cn_nameptr, cnp->cn_namelen, &de);
Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.119 src/sys/fs/udf/udf_vnops.c:1.120
--- src/sys/fs/udf/udf_vnops.c:1.119 Wed Feb 16 17:00:56 2022
+++ src/sys/fs/udf/udf_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.119 2022/02/16 22:00:56 andvar Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.120 2022/03/27 16:24:58 christos 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.119 2022/02/16 22:00:56 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.120 2022/03/27 16:24:58 christos Exp $");
#endif /* not lint */
@@ -1559,18 +1559,21 @@ udf_do_link(struct vnode *dvp, struct vn
udf_node = VTOI(vp);
error = VOP_GETATTR(vp, &vap, FSCRED);
- if (error) {
- VOP_UNLOCK(vp);
- return error;
- }
+ if (error)
+ goto out;
/* check link count overflow */
if (vap.va_nlink >= (1<<16)-1) { /* uint16_t */
- VOP_UNLOCK(vp);
- return EMLINK;
+ error = EMLINK;
+ goto out;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto out;
error = udf_dir_attach(dir_node->ump, dir_node, udf_node, &vap, cnp);
+out:
if (error)
VOP_UNLOCK(vp);
return error;
Index: src/sys/fs/v7fs/v7fs_vnops.c
diff -u src/sys/fs/v7fs/v7fs_vnops.c:1.34 src/sys/fs/v7fs/v7fs_vnops.c:1.35
--- src/sys/fs/v7fs/v7fs_vnops.c:1.34 Fri Feb 11 05:55:15 2022
+++ src/sys/fs/v7fs/v7fs_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $ */
+/* $NetBSD: v7fs_vnops.c,v 1.35 2022/03/27 16:24:58 christos Exp $ */
/*-
* Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.35 2022/03/27 16:24:58 christos Exp $");
#if defined _KERNEL_OPT
#include "opt_v7fs.h"
#endif
@@ -745,21 +745,27 @@ v7fs_link(void *v)
struct v7fs_inode *p = &node->inode;
struct v7fs_self *fs = node->v7fsmount->core;
struct componentname *cnp = a->a_cnp;
- int error = 0;
+ int error, abrt = 1;
DPRINTF("%p\n", vp);
- /* Lock soruce file */
+ /* Lock source file */
if ((error = vn_lock(vp, LK_EXCLUSIVE))) {
DPRINTF("lock failed. %p\n", vp);
- VOP_ABORTOP(dvp, cnp);
goto unlock;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto unlock;
+ abrt = 0;
error = v7fs_file_link(fs, parent, p, cnp->cn_nameptr, cnp->cn_namelen);
/* Sync dirent size change. */
uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
VOP_UNLOCK(vp);
unlock:
+ if (abrt)
+ VOP_ABORTOP(dvp, cnp);
return error;
}
Index: src/sys/nfs/nfs_vnops.c
diff -u src/sys/nfs/nfs_vnops.c:1.321 src/sys/nfs/nfs_vnops.c:1.322
--- src/sys/nfs/nfs_vnops.c:1.321 Tue Oct 19 23:08:18 2021
+++ src/sys/nfs/nfs_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: nfs_vnops.c,v 1.321 2021/10/20 03:08:18 thorpej Exp $ */
+/* $NetBSD: nfs_vnops.c,v 1.322 2022/03/27 16:24:58 christos Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.321 2021/10/20 03:08:18 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_vnops.c,v 1.322 2022/03/27 16:24:58 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_nfs.h"
@@ -2012,6 +2012,13 @@ nfs_link(void *v)
return error;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error) {
+ VOP_ABORTOP(dvp, cnp);
+ return error;
+ }
+
/*
* Push all writes to the server, so that the attribute cache
* doesn't get "out of sync" with the server.
Index: src/sys/ufs/chfs/chfs_vnops.c
diff -u src/sys/ufs/chfs/chfs_vnops.c:1.47 src/sys/ufs/chfs/chfs_vnops.c:1.48
--- src/sys/ufs/chfs/chfs_vnops.c:1.47 Tue Dec 7 16:37:37 2021
+++ src/sys/ufs/chfs/chfs_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_vnops.c,v 1.47 2021/12/07 21:37:37 andvar Exp $ */
+/* $NetBSD: chfs_vnops.c,v 1.48 2022/03/27 16:24:58 christos Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -1081,32 +1081,36 @@ chfs_link(void *v)
struct componentname *cnp = ((struct vop_link_v2_args *) v)->a_cnp;
struct chfs_inode *ip, *parent;
- int error = 0;
+ int error, abrt = 1;
if (vp->v_type == VDIR) {
- VOP_ABORTOP(dvp, cnp);
error = EISDIR;
goto out;
}
if (dvp->v_mount != vp->v_mount) {
- VOP_ABORTOP(dvp, cnp);
error = EXDEV;
goto out;
}
- if (dvp != vp && (error = vn_lock(vp, LK_EXCLUSIVE))) {
- VOP_ABORTOP(dvp, cnp);
+ if (dvp != vp && (error = vn_lock(vp, LK_EXCLUSIVE)))
+ goto out;
+
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
goto out;
- }
parent = VTOI(dvp);
ip = VTOI(vp);
+ abrt = 0;
error = chfs_do_link(ip,
parent, cnp->cn_nameptr, cnp->cn_namelen, ip->ch_type);
if (dvp != vp)
VOP_UNLOCK(vp);
out:
+ if (abrt)
+ VOP_ABORTOP(dvp, cnp);
return error;
}
Index: src/sys/ufs/ext2fs/ext2fs_vnops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.136 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.137
--- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.136 Tue Oct 19 23:08:19 2021
+++ src/sys/ufs/ext2fs/ext2fs_vnops.c Sun Mar 27 12:24:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_vnops.c,v 1.136 2021/10/20 03:08:19 thorpej Exp $ */
+/* $NetBSD: ext2fs_vnops.c,v 1.137 2022/03/27 16:24:58 christos Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.136 2021/10/20 03:08:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.137 2022/03/27 16:24:58 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -580,7 +580,7 @@ ext2fs_link(void *v)
struct vnode *vp = ap->a_vp;
struct componentname *cnp = ap->a_cnp;
struct inode *ip;
- int error;
+ int error, abrt = 1;
struct ufs_lookup_results *ulr;
KASSERT(dvp != vp);
@@ -592,23 +592,24 @@ ext2fs_link(void *v)
UFS_CHECK_CRAPCOUNTER(VTOI(dvp));
error = vn_lock(vp, LK_EXCLUSIVE);
- if (error) {
- VOP_ABORTOP(dvp, cnp);
+ if (error)
goto out2;
- }
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto out1;
ip = VTOI(vp);
if ((nlink_t)ip->i_e2fs_nlink >= EXT2FS_LINK_MAX) {
- VOP_ABORTOP(dvp, cnp);
error = EMLINK;
goto out1;
}
if (ip->i_e2fs_flags & (EXT2_IMMUTABLE | EXT2_APPEND)) {
- VOP_ABORTOP(dvp, cnp);
error = EPERM;
goto out1;
}
ip->i_e2fs_nlink++;
ip->i_flag |= IN_CHANGE;
+ abrt = 0;
error = ext2fs_update(vp, NULL, NULL, UPDATE_WAIT);
if (!error)
error = ext2fs_direnter(ip, dvp, ulr, cnp);
@@ -619,6 +620,8 @@ ext2fs_link(void *v)
out1:
VOP_UNLOCK(vp);
out2:
+ if (abrt)
+ VOP_ABORTOP(dvp, cnp);
return error;
}
Index: src/sys/ufs/lfs/ulfs_vnops.c
diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.55 src/sys/ufs/lfs/ulfs_vnops.c:1.56
--- src/sys/ufs/lfs/ulfs_vnops.c:1.55 Tue Oct 19 23:08:19 2021
+++ src/sys/ufs/lfs/ulfs_vnops.c Sun Mar 27 12:24:59 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_vnops.c,v 1.55 2021/10/20 03:08:19 thorpej Exp $ */
+/* $NetBSD: ulfs_vnops.c,v 1.56 2022/03/27 16:24:59 christos Exp $ */
/* from NetBSD: ufs_vnops.c,v 1.232 2016/05/19 18:32:03 riastradh Exp */
/*-
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.55 2021/10/20 03:08:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.56 2022/03/27 16:24:59 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -561,7 +561,7 @@ ulfs_link(void *v)
struct vnode *vp = ap->a_vp;
struct componentname *cnp = ap->a_cnp;
struct inode *ip;
- int error;
+ int error, abrt = 1;
struct ulfs_lookup_results *ulr;
KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE);
@@ -573,26 +573,26 @@ ulfs_link(void *v)
ULFS_CHECK_CRAPCOUNTER(VTOI(dvp));
error = vn_lock(vp, LK_EXCLUSIVE);
- if (error) {
- VOP_ABORTOP(dvp, cnp);
+ if (error)
goto out2;
- }
if (vp->v_mount != dvp->v_mount) {
error = ENOENT;
- VOP_ABORTOP(dvp, cnp);
goto out2;
}
ip = VTOI(vp);
if ((nlink_t)ip->i_nlink >= LINK_MAX) {
- VOP_ABORTOP(dvp, cnp);
error = EMLINK;
goto out1;
}
if (ip->i_flags & (IMMUTABLE | APPEND)) {
- VOP_ABORTOP(dvp, cnp);
error = EPERM;
goto out1;
}
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto out1;
+ abrt = 0;
ip->i_nlink++;
DIP_ASSIGN(ip, nlink, ip->i_nlink);
ip->i_state |= IN_CHANGE;
@@ -608,6 +608,8 @@ ulfs_link(void *v)
}
out1:
VOP_UNLOCK(vp);
+ if (abrt)
+ VOP_ABORTOP(dvp, cnp);
out2:
return (error);
}
Index: src/sys/ufs/ufs/ufs_vnops.c
diff -u src/sys/ufs/ufs/ufs_vnops.c:1.261 src/sys/ufs/ufs/ufs_vnops.c:1.262
--- src/sys/ufs/ufs/ufs_vnops.c:1.261 Fri Nov 26 12:35:12 2021
+++ src/sys/ufs/ufs/ufs_vnops.c Sun Mar 27 12:24:59 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_vnops.c,v 1.261 2021/11/26 17:35:12 christos Exp $ */
+/* $NetBSD: ufs_vnops.c,v 1.262 2022/03/27 16:24:59 christos Exp $ */
/*-
* Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.261 2021/11/26 17:35:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.262 2022/03/27 16:24:59 christos Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -893,7 +893,7 @@ ufs_link(void *v)
struct mount *mp = dvp->v_mount;
struct inode *ip;
struct direct *newdir;
- int error;
+ int error, abrt = 1;
struct ufs_lookup_results *ulr;
KASSERT(dvp != vp);
@@ -905,29 +905,32 @@ ufs_link(void *v)
UFS_CHECK_CRAPCOUNTER(VTOI(dvp));
error = vn_lock(vp, LK_EXCLUSIVE);
- if (error) {
- VOP_ABORTOP(dvp, cnp);
+ if (error)
goto out2;
- }
+
ip = VTOI(vp);
if ((nlink_t)ip->i_nlink >= LINK_MAX) {
- VOP_ABORTOP(dvp, cnp);
error = EMLINK;
goto out1;
}
if (ip->i_flags & (IMMUTABLE | APPEND)) {
- VOP_ABORTOP(dvp, cnp);
error = EPERM;
goto out1;
}
+
+ error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_ADD_LINK, vp,
+ dvp, 0);
+ if (error)
+ goto out1;
+
error = UFS_WAPBL_BEGIN(mp);
- if (error) {
- VOP_ABORTOP(dvp, cnp);
+ if (error)
goto out1;
- }
+
ip->i_nlink++;
DIP_ASSIGN(ip, nlink, ip->i_nlink);
ip->i_flag |= IN_CHANGE;
+ abrt = 0;
error = UFS_UPDATE(vp, NULL, NULL, UPDATE_DIROP);
if (!error) {
newdir = pool_cache_get(ufs_direct_cache, PR_WAITOK);
@@ -945,6 +948,8 @@ ufs_link(void *v)
out1:
VOP_UNLOCK(vp);
out2:
+ if (abrt)
+ VOP_ABORTOP(dvp, cnp);
return (error);
}