Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet/sctp_syscalls.c
Show All 26 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include "opt_capsicum.h" | #include "opt_capsicum.h" | ||||
#include "opt_inet.h" | |||||
#include "opt_inet6.h" | |||||
#include "opt_sctp.h" | #include "opt_sctp.h" | ||||
#include "opt_ktrace.h" | #include "opt_ktrace.h" | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/capsicum.h> | #include <sys/capsicum.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | #endif | ||||
error = syscall_helper_unregister(sctp_syscalls); | error = syscall_helper_unregister(sctp_syscalls); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* SCTP syscalls. | * SCTP syscalls. | ||||
* Functionality only compiled in if SCTP is defined in the kernel Makefile, | |||||
* otherwise all return EOPNOTSUPP. | |||||
*/ | */ | ||||
int | int | ||||
sys_sctp_peeloff(td, uap) | sys_sctp_peeloff(td, uap) | ||||
struct thread *td; | struct thread *td; | ||||
struct sctp_peeloff_args /* { | struct sctp_peeloff_args /* { | ||||
int sd; | int sd; | ||||
caddr_t name; | caddr_t name; | ||||
} */ *uap; | } */ *uap; | ||||
{ | { | ||||
#if defined(INET) || defined(INET6) | |||||
struct file *headfp, *nfp = NULL; | struct file *headfp, *nfp = NULL; | ||||
struct socket *head, *so; | struct socket *head, *so; | ||||
cap_rights_t rights; | cap_rights_t rights; | ||||
u_int fflag; | u_int fflag; | ||||
int error, fd; | int error, fd; | ||||
AUDIT_ARG_FD(uap->sd); | AUDIT_ARG_FD(uap->sd); | ||||
error = getsock_cap(td, uap->sd, cap_rights_init(&rights, CAP_PEELOFF), | error = getsock_cap(td, uap->sd, cap_rights_init(&rights, CAP_PEELOFF), | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | noconnection: | ||||
*/ | */ | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
done: | done: | ||||
if (nfp != NULL) | if (nfp != NULL) | ||||
fdrop(nfp, td); | fdrop(nfp, td); | ||||
fdrop(headfp, td); | fdrop(headfp, td); | ||||
done2: | done2: | ||||
return (error); | return (error); | ||||
#endif | |||||
} | } | ||||
int | int | ||||
sys_sctp_generic_sendmsg (td, uap) | sys_sctp_generic_sendmsg (td, uap) | ||||
struct thread *td; | struct thread *td; | ||||
struct sctp_generic_sendmsg_args /* { | struct sctp_generic_sendmsg_args /* { | ||||
int sd, | int sd, | ||||
caddr_t msg, | caddr_t msg, | ||||
int mlen, | int mlen, | ||||
caddr_t to, | caddr_t to, | ||||
__socklen_t tolen, | __socklen_t tolen, | ||||
struct sctp_sndrcvinfo *sinfo, | struct sctp_sndrcvinfo *sinfo, | ||||
int flags | int flags | ||||
} */ *uap; | } */ *uap; | ||||
{ | { | ||||
#if defined(INET) || defined(INET6) | |||||
struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; | struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; | ||||
struct socket *so; | struct socket *so; | ||||
struct file *fp = NULL; | struct file *fp = NULL; | ||||
struct sockaddr *to = NULL; | struct sockaddr *to = NULL; | ||||
#ifdef KTRACE | #ifdef KTRACE | ||||
struct uio *ktruio = NULL; | struct uio *ktruio = NULL; | ||||
#endif | #endif | ||||
struct uio auio; | struct uio auio; | ||||
▲ Show 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | #ifdef KTRACE | ||||
} | } | ||||
#endif /* KTRACE */ | #endif /* KTRACE */ | ||||
sctp_bad: | sctp_bad: | ||||
if (fp != NULL) | if (fp != NULL) | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
sctp_bad2: | sctp_bad2: | ||||
free(to, M_SONAME); | free(to, M_SONAME); | ||||
return (error); | return (error); | ||||
#endif | |||||
} | } | ||||
int | int | ||||
sys_sctp_generic_sendmsg_iov(td, uap) | sys_sctp_generic_sendmsg_iov(td, uap) | ||||
struct thread *td; | struct thread *td; | ||||
struct sctp_generic_sendmsg_iov_args /* { | struct sctp_generic_sendmsg_iov_args /* { | ||||
int sd, | int sd, | ||||
struct iovec *iov, | struct iovec *iov, | ||||
int iovlen, | int iovlen, | ||||
caddr_t to, | caddr_t to, | ||||
__socklen_t tolen, | __socklen_t tolen, | ||||
struct sctp_sndrcvinfo *sinfo, | struct sctp_sndrcvinfo *sinfo, | ||||
int flags | int flags | ||||
} */ *uap; | } */ *uap; | ||||
{ | { | ||||
#if defined(INET) || defined(INET6) | |||||
struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; | struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; | ||||
struct socket *so; | struct socket *so; | ||||
struct file *fp = NULL; | struct file *fp = NULL; | ||||
struct sockaddr *to = NULL; | struct sockaddr *to = NULL; | ||||
#ifdef KTRACE | #ifdef KTRACE | ||||
struct uio *ktruio = NULL; | struct uio *ktruio = NULL; | ||||
#endif | #endif | ||||
struct uio auio; | struct uio auio; | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | |||||
sctp_bad: | sctp_bad: | ||||
free(iov, M_IOV); | free(iov, M_IOV); | ||||
sctp_bad1: | sctp_bad1: | ||||
if (fp != NULL) | if (fp != NULL) | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
sctp_bad2: | sctp_bad2: | ||||
free(to, M_SONAME); | free(to, M_SONAME); | ||||
return (error); | return (error); | ||||
#endif | |||||
} | } | ||||
int | int | ||||
sys_sctp_generic_recvmsg(td, uap) | sys_sctp_generic_recvmsg(td, uap) | ||||
struct thread *td; | struct thread *td; | ||||
struct sctp_generic_recvmsg_args /* { | struct sctp_generic_recvmsg_args /* { | ||||
int sd, | int sd, | ||||
struct iovec *iov, | struct iovec *iov, | ||||
int iovlen, | int iovlen, | ||||
struct sockaddr *from, | struct sockaddr *from, | ||||
__socklen_t *fromlenaddr, | __socklen_t *fromlenaddr, | ||||
struct sctp_sndrcvinfo *sinfo, | struct sctp_sndrcvinfo *sinfo, | ||||
int *msg_flags | int *msg_flags | ||||
} */ *uap; | } */ *uap; | ||||
{ | { | ||||
#if defined(INET) || defined(INET6) | |||||
uint8_t sockbufstore[256]; | uint8_t sockbufstore[256]; | ||||
struct uio auio; | struct uio auio; | ||||
struct iovec *iov, *tiov; | struct iovec *iov, *tiov; | ||||
struct sctp_sndrcvinfo sinfo; | struct sctp_sndrcvinfo sinfo; | ||||
struct socket *so; | struct socket *so; | ||||
struct file *fp = NULL; | struct file *fp = NULL; | ||||
struct sockaddr *fromsa; | struct sockaddr *fromsa; | ||||
cap_rights_t rights; | cap_rights_t rights; | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | #endif | ||||
} | } | ||||
out: | out: | ||||
free(iov, M_IOV); | free(iov, M_IOV); | ||||
out1: | out1: | ||||
if (fp != NULL) | if (fp != NULL) | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
return (error); | return (error); | ||||
#endif | |||||
} | } |