36#include <sys/capsicum.h>
40#include <sys/sysproto.h>
43#include <sys/filedesc.h>
44#include <sys/limits.h>
47#include <sys/extattr.h>
49#include <security/audit/audit.h>
50#include <security/mac/mac_framework.h>
54 size_t nbytes,
int follow);
57 size_t nbytes,
int follow);
70#ifndef _SYS_SYSPROTO_H_
82 struct vnode *filename_vp;
84 struct mount *mp, *mp_writable;
85 char attrname[EXTATTR_MAXNAMELEN + 1];
88 AUDIT_ARG_CMD(uap->
cmd);
95 error = copyinstr(uap->
attrname, attrname,
sizeof(attrname),
100 AUDIT_ARG_TEXT(attrname);
105 NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE2, UIO_USERSPACE,
110 filename_vp = nd.ni_vp;
111 NDFREE(&nd, NDF_NO_VP_RELE);
115 NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | AUDITVNODE1, UIO_USERSPACE,
120 mp = nd.ni_vp->v_mount;
127 VOP_UNLOCK(nd.ni_vp);
129 NDFREE(&nd, NDF_NO_VP_UNLOCK);
132 if (filename_vp != NULL) {
138 error = vn_lock(filename_vp, LK_EXCLUSIVE);
146 uap->
attrname != NULL ? attrname : NULL);
157 if (filename_vp != NULL)
188 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
190 aiov.iov_base =
data;
192 auio.uio_iov = &aiov;
196 auio.uio_rw = UIO_WRITE;
197 auio.uio_segflg = UIO_USERSPACE;
202 error = mac_vnode_check_setextattr(td->td_ucred, vp,
attrnamespace,
210 cnt -= auio.uio_resid;
211 td->td_retval[0] = cnt;
221#ifndef _SYS_SYSPROTO_H_
234 char attrname[EXTATTR_MAXNAMELEN + 1];
238 AUDIT_ARG_FD(uap->
fd);
240 error = copyinstr(uap->
attrname, attrname,
sizeof(attrname), NULL);
243 AUDIT_ARG_TEXT(attrname);
246 cap_rights_init_one(&rights, CAP_EXTATTR_SET), &fp);
257#ifndef _SYS_SYSPROTO_H_
274#ifndef _SYS_SYSPROTO_H_
293 const char *uattrname,
void *
data,
size_t nbytes,
int follow)
296 char attrname[EXTATTR_MAXNAMELEN + 1];
300 error = copyinstr(uattrname, attrname,
sizeof(attrname), NULL);
303 AUDIT_ARG_TEXT(attrname);
305 NDINIT(&nd, LOOKUP, follow | AUDITVNODE1, UIO_USERSPACE,
path);
309 NDFREE(&nd, NDF_ONLY_PNBUF);
332 struct uio auio, *auiop;
341 vn_lock(vp, LK_SHARED | LK_RETRY);
352 aiov.iov_base =
data;
354 auio.uio_iov = &aiov;
358 auio.uio_rw = UIO_READ;
359 auio.uio_segflg = UIO_USERSPACE;
367 error = mac_vnode_check_getextattr(td->td_ucred, vp,
attrnamespace,
373 error = VOP_GETEXTATTR(vp,
attrnamespace, attrname, auiop, sizep,
377 cnt -= auio.uio_resid;
378 td->td_retval[0] = cnt;
380 td->td_retval[0] = size;
388#ifndef _SYS_SYSPROTO_H_
401 char attrname[EXTATTR_MAXNAMELEN + 1];
405 AUDIT_ARG_FD(uap->
fd);
407 error = copyinstr(uap->
attrname, attrname,
sizeof(attrname), NULL);
410 AUDIT_ARG_TEXT(attrname);
413 cap_rights_init_one(&rights, CAP_EXTATTR_GET), &fp);
424#ifndef _SYS_SYSPROTO_H_
440#ifndef _SYS_SYSPROTO_H_
458 const char *uattrname,
void *
data,
size_t nbytes,
int follow)
461 char attrname[EXTATTR_MAXNAMELEN + 1];
465 error = copyinstr(uattrname, attrname,
sizeof(attrname), NULL);
468 AUDIT_ARG_TEXT(attrname);
470 NDINIT(&nd, LOOKUP, follow | AUDITVNODE1, UIO_USERSPACE,
path);
474 NDFREE(&nd, NDF_ONLY_PNBUF);
503 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
506 error = mac_vnode_check_deleteextattr(td->td_ucred, vp,
attrnamespace,
512 error = VOP_DELETEEXTATTR(vp,
attrnamespace, attrname, td->td_ucred,
514 if (error == EOPNOTSUPP)
525#ifndef _SYS_SYSPROTO_H_
536 char attrname[EXTATTR_MAXNAMELEN + 1];
540 AUDIT_ARG_FD(uap->
fd);
542 error = copyinstr(uap->
attrname, attrname,
sizeof(attrname), NULL);
545 AUDIT_ARG_TEXT(attrname);
548 cap_rights_init_one(&rights, CAP_EXTATTR_DELETE), &fp);
558#ifndef _SYS_SYSPROTO_H_
573#ifndef _SYS_SYSPROTO_H_
590 const char *uattrname,
int follow)
593 char attrname[EXTATTR_MAXNAMELEN + 1];
597 error = copyinstr(uattrname, attrname,
sizeof(attrname), NULL);
600 AUDIT_ARG_TEXT(attrname);
602 NDINIT(&nd, LOOKUP, follow | AUDITVNODE1, UIO_USERSPACE,
path);
606 NDFREE(&nd, NDF_ONLY_PNBUF);
625 size_t nbytes,
struct thread *td)
627 struct uio auio, *auiop;
640 aiov.iov_base =
data;
642 auio.uio_iov = &aiov;
646 auio.uio_rw = UIO_READ;
647 auio.uio_segflg = UIO_USERSPACE;
654 vn_lock(vp, LK_SHARED | LK_RETRY);
657 error = mac_vnode_check_listextattr(td->td_ucred, vp,
attrnamespace);
669 cnt -= auio.uio_resid;
670 td->td_retval[0] = cnt;
672 td->td_retval[0] = size;
676#ifndef _SYS_SYSPROTO_H_
691 AUDIT_ARG_FD(uap->
fd);
694 cap_rights_init_one(&rights, CAP_EXTATTR_LIST), &fp);
705#ifndef _SYS_SYSPROTO_H_
721#ifndef _SYS_SYSPROTO_H_
745 NDINIT(&nd, LOOKUP, follow | AUDITVNODE1, UIO_USERSPACE,
path);
749 NDFREE(&nd, NDF_ONLY_PNBUF);
int sys_extattr_set_fd(struct thread *td, struct extattr_set_fd_args *uap)
struct extattr_list_link_args sys_extattr_list_file
int sys_extattr_get_file(struct thread *td, struct extattr_get_file_args *uap)
int sys_extattr_get_link(struct thread *td, struct extattr_get_link_args *uap)
static int extattr_get_vp(struct vnode *vp, int attrnamespace, const char *attrname, void *data, size_t nbytes, struct thread *td)
int sys_extattr_delete_file(struct thread *td, struct extattr_delete_file_args *uap)
int sys_extattr_list_fd(struct thread *td, struct extattr_list_fd_args *uap)
static int kern_extattr_set_path(struct thread *td, const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes, int follow)
static int extattr_set_vp(struct vnode *vp, int attrnamespace, const char *attrname, void *data, size_t nbytes, struct thread *td)
int sys_extattr_delete_link(struct thread *td, struct extattr_delete_link_args *uap)
int sys_extattr_list_link(struct thread *td, struct extattr_list_link_args *uap)
int sys_extattr_delete_fd(struct thread *td, struct extattr_delete_fd_args *uap)
static int kern_extattr_delete_path(struct thread *td, const char *path, int attrnamespace, const char *attrname, int follow)
int sys_extattr_set_file(struct thread *td, struct extattr_set_file_args *uap)
static int kern_extattr_get_path(struct thread *td, const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes, int follow)
int sys_extattr_set_link(struct thread *td, struct extattr_set_link_args *uap)
static int kern_extattr_list_path(struct thread *td, const char *path, int attrnamespace, void *data, size_t nbytes, int follow)
int sys_extattr_get_fd(struct thread *td, struct extattr_get_fd_args *uap)
static int extattr_delete_vp(struct vnode *vp, int attrnamespace, const char *attrname, struct thread *td)
int sys_extattrctl(struct thread *td, struct extattrctl_args *uap)
static int extattr_list_vp(struct vnode *vp, int attrnamespace, void *data, size_t nbytes, struct thread *td)
void() NDFREE(struct nameidata *ndp, const u_int flags)
int namei(struct nameidata *ndp)
void vfs_unbusy(struct mount *mp)
void vrele(struct vnode *vp)
int vfs_busy(struct mount *mp, int flags)
int getvnode_path(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
int vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
void vn_finished_write(struct mount *mp)