Make vop_symlink take a const target path.

This will enable callers to take const paths as part of syscall
decleration improvements.

Where doing so is easy and non-distruptive carry the const through
implementations. In UFS the value is passed to an interface that must
take non-const values. In ZFS, const poisoning would touch code shared
with upstream and it's not worth adding diffs.

Bump __FreeBSD_version for external API consumers.

Reviewed by:	kib (prior version)
Obtained from:	CheriBSD
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D17805
This commit is contained in:
Brooks Davis 2018-11-02 14:42:36 +00:00
parent be81239ddc
commit 1493c2ee62
13 changed files with 20 additions and 20 deletions

View File

@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd July 24, 1996
.Dd November 2, 2018
.Dt VOP_CREATE 9
.Os
.Sh NAME
@ -48,7 +48,7 @@
.Ft int
.Fn VOP_MKDIR "struct vnode *dvp" "struct vnode **vpp" "struct componentname *cnp" "struct vattr *vap"
.Ft int
.Fn VOP_SYMLINK "struct vnode *dvp" "struct vnode **vpp" "struct componentname *cnp" "struct vattr *vap" "char *target"
.Fn VOP_SYMLINK "struct vnode *dvp" "struct vnode **vpp" "struct componentname *cnp" "struct vattr *vap" "const char *target"
.Sh DESCRIPTION
These entry points create a new file, socket, fifo, device, directory or symlink
in a given directory.

View File

@ -5314,7 +5314,7 @@ zfs_freebsd_symlink(ap)
vattr_init_mask(vap);
return (zfs_symlink(ap->a_dvp, ap->a_vpp, cnp->cn_nameptr, vap,
ap->a_target, cnp->cn_cred, cnp->cn_thread));
__DECONST(char *, ap->a_target), cnp->cn_cred, cnp->cn_thread));
}
static int

View File

@ -1521,8 +1521,8 @@ ext2_symlink(struct vop_symlink_args *ap)
ip->i_size = len;
ip->i_flag |= IN_CHANGE | IN_UPDATE;
} else
error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0,
UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target),
len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
ap->a_cnp->cn_cred, NOCRED, NULL, NULL);
if (error)
vput(vp);

View File

@ -1708,7 +1708,7 @@ fuse_vnop_symlink(struct vop_symlink_args *ap)
struct vnode *dvp = ap->a_dvp;
struct vnode **vpp = ap->a_vpp;
struct componentname *cnp = ap->a_cnp;
char *target = ap->a_target;
const char *target = ap->a_target;
struct fuse_dispatcher fdi;

View File

@ -1939,8 +1939,8 @@ nandfs_symlink(struct vop_symlink_args *ap)
len = strlen(ap->a_target);
error = vn_rdwr(UIO_WRITE, *vpp, ap->a_target, len, (off_t)0,
UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
error = vn_rdwr(UIO_WRITE, *vpp, __DECONST(void *, ap->a_target),
len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
cnp->cn_cred, NOCRED, NULL, NULL);
if (error)
vput(*vpp);

View File

@ -474,7 +474,7 @@ int nfsrpc_rename(vnode_t, vnode_t, char *, int, vnode_t, vnode_t, char *, int,
int nfsrpc_link(vnode_t, vnode_t, char *, int,
struct ucred *, NFSPROC_T *, struct nfsvattr *, struct nfsvattr *,
int *, int *, void *);
int nfsrpc_symlink(vnode_t, char *, int, char *, struct vattr *,
int nfsrpc_symlink(vnode_t, char *, int, const char *, struct vattr *,
struct ucred *, NFSPROC_T *, struct nfsvattr *, struct nfsvattr *,
struct nfsfh **, int *, int *, void *);
int nfsrpc_mkdir(vnode_t, char *, int, struct vattr *,

View File

@ -2627,7 +2627,7 @@ nfsrpc_link(vnode_t dvp, vnode_t vp, char *name, int namelen,
* nfs symbolic link create rpc
*/
APPLESTATIC int
nfsrpc_symlink(vnode_t dvp, char *name, int namelen, char *target,
nfsrpc_symlink(vnode_t dvp, char *name, int namelen, const char *target,
struct vattr *vap, struct ucred *cred, NFSPROC_T *p, struct nfsvattr *dnap,
struct nfsvattr *nnap, struct nfsfh **nfhpp, int *attrflagp,
int *dattrflagp, void *dstuff)

View File

@ -411,7 +411,7 @@ void tmpfs_ref_node(struct tmpfs_node *node);
void tmpfs_ref_node_locked(struct tmpfs_node *node);
int tmpfs_alloc_node(struct mount *mp, struct tmpfs_mount *, enum vtype,
uid_t uid, gid_t gid, mode_t mode, struct tmpfs_node *,
char *, dev_t, struct tmpfs_node **);
const char *, dev_t, struct tmpfs_node **);
void tmpfs_free_node(struct tmpfs_mount *, struct tmpfs_node *);
bool tmpfs_free_node_locked(struct tmpfs_mount *, struct tmpfs_node *, bool);
void tmpfs_free_tmp(struct tmpfs_mount *);
@ -424,7 +424,7 @@ int tmpfs_alloc_vp(struct mount *, struct tmpfs_node *, int,
struct vnode **);
void tmpfs_free_vp(struct vnode *);
int tmpfs_alloc_file(struct vnode *, struct vnode **, struct vattr *,
struct componentname *, char *);
struct componentname *, const char *);
void tmpfs_check_mtime(struct vnode *);
void tmpfs_dir_attach(struct vnode *, struct tmpfs_dirent *);
void tmpfs_dir_detach(struct vnode *, struct tmpfs_dirent *);

View File

@ -182,7 +182,7 @@ tmpfs_ref_node_locked(struct tmpfs_node *node)
int
tmpfs_alloc_node(struct mount *mp, struct tmpfs_mount *tmp, enum vtype type,
uid_t uid, gid_t gid, mode_t mode, struct tmpfs_node *parent,
char *target, dev_t rdev, struct tmpfs_node **node)
const char *target, dev_t rdev, struct tmpfs_node **node)
{
struct tmpfs_node *nnode;
vm_object_t obj;
@ -717,7 +717,7 @@ tmpfs_free_vp(struct vnode *vp)
*/
int
tmpfs_alloc_file(struct vnode *dvp, struct vnode **vpp, struct vattr *vap,
struct componentname *cnp, char *target)
struct componentname *cnp, const char *target)
{
int error;
struct tmpfs_dirent *de;

View File

@ -1176,7 +1176,7 @@ tmpfs_symlink(struct vop_symlink_args *v)
struct vnode **vpp = v->a_vpp;
struct componentname *cnp = v->a_cnp;
struct vattr *vap = v->a_vap;
char *target = v->a_target;
const char *target = v->a_target;
#ifdef notyet /* XXX FreeBSD BUG: kern_symlink is not setting VLNK */
MPASS(vap->va_type == VLNK);

View File

@ -325,7 +325,7 @@ vop_symlink {
OUT struct vnode **vpp;
IN struct componentname *cnp;
IN struct vattr *vap;
IN char *target;
IN const char *target;
};

View File

@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
#define __FreeBSD_version 1300002 /* Master, propagated to newvers */
#define __FreeBSD_version 1300003 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,

View File

@ -2095,7 +2095,7 @@ ufs_symlink(ap)
struct vnode **a_vpp;
struct componentname *a_cnp;
struct vattr *a_vap;
char *a_target;
const char *a_target;
} */ *ap;
{
struct vnode *vp, **vpp = ap->a_vpp;
@ -2116,8 +2116,8 @@ ufs_symlink(ap)
ip->i_flag |= IN_CHANGE | IN_UPDATE;
error = UFS_UPDATE(vp, 0);
} else
error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0,
UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target),
len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK,
ap->a_cnp->cn_cred, NOCRED, NULL, NULL);
if (error)
vput(vp);