Print this page
OS-4865 lxbrand async socket errors catch programs off guard
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4213 lxbrand should be able to set TCP_DEFER_ACCEPT after other socket operations
OS-3893 sendfile compat checks shouldn't be done in so_sendmblk
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
*** 126,136 ****
so_bind(struct sonode *so, struct sockaddr *name, socklen_t namelen,
int flags, struct cred *cr)
{
int error;
! SO_BLOCK_FALLBACK(so, SOP_BIND(so, name, namelen, flags, cr));
ASSERT(flags == _SOBIND_XPG4_2 || flags == _SOBIND_SOCKBSD);
/* X/Open requires this check */
if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) {
--- 126,136 ----
so_bind(struct sonode *so, struct sockaddr *name, socklen_t namelen,
int flags, struct cred *cr)
{
int error;
! SO_BLOCK_FALLBACK_SAFE(so, SOP_BIND(so, name, namelen, flags, cr));
ASSERT(flags == _SOBIND_XPG4_2 || flags == _SOBIND_SOCKBSD);
/* X/Open requires this check */
if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) {
*** 303,313 ****
/*
* If there is a pending error, return error
* This can happen if a non blocking operation caused an error.
*/
! if (so->so_error != 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
goto done;
--- 303,313 ----
/*
* If there is a pending error, return error
* This can happen if a non blocking operation caused an error.
*/
! if (so->so_error != 0 && (so->so_mode & SM_DEFERERR) == 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
goto done;
*** 402,412 ****
if (so->so_state & SS_CANTSENDMORE) {
error = EPIPE;
break;
}
! if (so->so_error != 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
break;
--- 402,412 ----
if (so->so_state & SS_CANTSENDMORE) {
error = EPIPE;
break;
}
! if (so->so_error != 0 && (so->so_mode & SM_DEFERERR) == 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
break;
*** 511,521 ****
if (so->so_state & SS_CANTSENDMORE) {
error = EPIPE;
break;
}
! if (so->so_error != 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
break;
--- 511,521 ----
if (so->so_state & SS_CANTSENDMORE) {
error = EPIPE;
break;
}
! if (so->so_error != 0 && (so->so_mode & SM_DEFERERR) == 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
break;
*** 584,598 ****
{
int error;
SO_BLOCK_FALLBACK(so, SOP_SENDMBLK(so, msg, fflag, cr, mpp));
- if ((so->so_mode & SM_SENDFILESUPP) == 0) {
- SO_UNBLOCK_FALLBACK(so);
- return (EOPNOTSUPP);
- }
-
error = so_sendmblk_impl(so, msg, fflag, cr, mpp, so->so_filter_top,
B_FALSE);
SO_UNBLOCK_FALLBACK(so);
--- 584,593 ----
*** 651,661 ****
so_getsockname(struct sonode *so, struct sockaddr *addr,
socklen_t *addrlen, struct cred *cr)
{
int error;
! SO_BLOCK_FALLBACK(so, SOP_GETSOCKNAME(so, addr, addrlen, cr));
if (so->so_filter_active == 0 ||
(error = sof_filter_getsockname(so, addr, addrlen, cr)) < 0)
error = (*so->so_downcalls->sd_getsockname)
(so->so_proto_handle, addr, addrlen, cr);
--- 646,656 ----
so_getsockname(struct sonode *so, struct sockaddr *addr,
socklen_t *addrlen, struct cred *cr)
{
int error;
! SO_BLOCK_FALLBACK_SAFE(so, SOP_GETSOCKNAME(so, addr, addrlen, cr));
if (so->so_filter_active == 0 ||
(error = sof_filter_getsockname(so, addr, addrlen, cr)) < 0)
error = (*so->so_downcalls->sd_getsockname)
(so->so_proto_handle, addr, addrlen, cr);
*** 700,710 ****
int error = 0;
if (level == SOL_FILTER)
return (sof_getsockopt(so, option_name, optval, optlenp, cr));
! SO_BLOCK_FALLBACK(so,
SOP_GETSOCKOPT(so, level, option_name, optval, optlenp, flags, cr));
if ((so->so_filter_active == 0 ||
(error = sof_filter_getsockopt(so, level, option_name, optval,
optlenp, cr)) < 0) &&
--- 695,705 ----
int error = 0;
if (level == SOL_FILTER)
return (sof_getsockopt(so, option_name, optval, optlenp, cr));
! SO_BLOCK_FALLBACK_SAFE(so,
SOP_GETSOCKOPT(so, level, option_name, optval, optlenp, flags, cr));
if ((so->so_filter_active == 0 ||
(error = sof_filter_getsockopt(so, level, option_name, optval,
optlenp, cr)) < 0) &&
*** 789,799 ****
const void *opt = optval;
if (level == SOL_FILTER)
return (sof_setsockopt(so, option_name, optval, optlen, cr));
! SO_BLOCK_FALLBACK(so,
SOP_SETSOCKOPT(so, level, option_name, optval, optlen, cr));
/* X/Open requires this check */
if (so->so_state & SS_CANTSENDMORE && !xnet_skip_checks) {
SO_UNBLOCK_FALLBACK(so);
--- 784,794 ----
const void *opt = optval;
if (level == SOL_FILTER)
return (sof_setsockopt(so, option_name, optval, optlen, cr));
! SO_BLOCK_FALLBACK_SAFE(so,
SOP_SETSOCKOPT(so, level, option_name, optval, optlen, cr));
/* X/Open requires this check */
if (so->so_state & SS_CANTSENDMORE && !xnet_skip_checks) {
SO_UNBLOCK_FALLBACK(so);
*** 874,884 ****
/*
* If there is a pending error, return error
* This can happen if a non blocking operation caused an error.
*/
! if (so->so_error != 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
goto done;
--- 869,879 ----
/*
* If there is a pending error, return error
* This can happen if a non blocking operation caused an error.
*/
! if (so->so_error != 0 && (so->so_mode & SM_DEFERERR) == 0) {
mutex_enter(&so->so_lock);
error = sogeterr(so, B_TRUE);
mutex_exit(&so->so_lock);
if (error != 0)
goto done;