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;