Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/uipc_syscalls.c
Show First 20 Lines • Show All 756 Lines • ▼ Show 20 Lines | #endif | ||||
AUDIT_ARG_FD(s); | AUDIT_ARG_FD(s); | ||||
cap_rights_init(&rights, CAP_SEND); | cap_rights_init(&rights, CAP_SEND); | ||||
if (mp->msg_name != NULL) { | if (mp->msg_name != NULL) { | ||||
AUDIT_ARG_SOCKADDR(td, AT_FDCWD, mp->msg_name); | AUDIT_ARG_SOCKADDR(td, AT_FDCWD, mp->msg_name); | ||||
cap_rights_set(&rights, CAP_CONNECT); | cap_rights_set(&rights, CAP_CONNECT); | ||||
} | } | ||||
error = getsock_cap(td, s, &rights, &fp, NULL, NULL); | error = getsock_cap(td, s, &rights, &fp, NULL, NULL); | ||||
if (error != 0) | if (error != 0) { | ||||
m_freem(control); | |||||
return (error); | return (error); | ||||
} | |||||
so = (struct socket *)fp->f_data; | so = (struct socket *)fp->f_data; | ||||
#ifdef KTRACE | #ifdef KTRACE | ||||
if (mp->msg_name != NULL && KTRPOINT(td, KTR_STRUCT)) | if (mp->msg_name != NULL && KTRPOINT(td, KTR_STRUCT)) | ||||
ktrsockaddr(mp->msg_name); | ktrsockaddr(mp->msg_name); | ||||
#endif | #endif | ||||
#ifdef MAC | #ifdef MAC | ||||
if (mp->msg_name != NULL) { | if (mp->msg_name != NULL) { | ||||
error = mac_socket_check_connect(td->td_ucred, so, | error = mac_socket_check_connect(td->td_ucred, so, | ||||
mp->msg_name); | mp->msg_name); | ||||
if (error != 0) | if (error != 0) { | ||||
m_freem(control); | |||||
goto bad; | goto bad; | ||||
} | } | ||||
} | |||||
error = mac_socket_check_send(td->td_ucred, so); | error = mac_socket_check_send(td->td_ucred, so); | ||||
if (error != 0) | if (error != 0) { | ||||
m_freem(control); | |||||
goto bad; | goto bad; | ||||
} | |||||
#endif | #endif | ||||
auio.uio_iov = mp->msg_iov; | auio.uio_iov = mp->msg_iov; | ||||
auio.uio_iovcnt = mp->msg_iovlen; | auio.uio_iovcnt = mp->msg_iovlen; | ||||
auio.uio_segflg = segflg; | auio.uio_segflg = segflg; | ||||
auio.uio_rw = UIO_WRITE; | auio.uio_rw = UIO_WRITE; | ||||
auio.uio_td = td; | auio.uio_td = td; | ||||
auio.uio_offset = 0; /* XXX */ | auio.uio_offset = 0; /* XXX */ | ||||
auio.uio_resid = 0; | auio.uio_resid = 0; | ||||
iov = mp->msg_iov; | iov = mp->msg_iov; | ||||
for (i = 0; i < mp->msg_iovlen; i++, iov++) { | for (i = 0; i < mp->msg_iovlen; i++, iov++) { | ||||
if ((auio.uio_resid += iov->iov_len) < 0) { | if ((auio.uio_resid += iov->iov_len) < 0) { | ||||
error = EINVAL; | error = EINVAL; | ||||
m_freem(control); | |||||
goto bad; | goto bad; | ||||
} | } | ||||
} | } | ||||
#ifdef KTRACE | #ifdef KTRACE | ||||
if (KTRPOINT(td, KTR_GENIO)) | if (KTRPOINT(td, KTR_GENIO)) | ||||
ktruio = cloneuio(&auio); | ktruio = cloneuio(&auio); | ||||
#endif | #endif | ||||
len = auio.uio_resid; | len = auio.uio_resid; | ||||
▲ Show 20 Lines • Show All 779 Lines • Show Last 20 Lines |