Print this page
OS-4647 lx fails to mount nfs share - Transport endpoint is already connected
*** 1581,1590 ****
--- 1581,1595 ----
case UDP_RCVHDR:
mutex_enter(&connp->conn_lock);
*i1 = udp->udp_rcvhdr ? 1 : 0;
mutex_exit(&connp->conn_lock);
return (sizeof (int));
+ case UDP_SND_TO_CONNECTED:
+ mutex_enter(&connp->conn_lock);
+ *i1 = udp->udp_snd_to_conn ? 1 : 0;
+ mutex_exit(&connp->conn_lock);
+ return (sizeof (int));
}
}
mutex_enter(&connp->conn_lock);
retval = conn_opt_get(&coas, level, name, ptr);
mutex_exit(&connp->conn_lock);
*** 1716,1725 ****
--- 1721,1735 ----
case UDP_RCVHDR:
mutex_enter(&connp->conn_lock);
udp->udp_rcvhdr = onoff;
mutex_exit(&connp->conn_lock);
return (0);
+ case UDP_SND_TO_CONNECTED:
+ mutex_enter(&connp->conn_lock);
+ udp->udp_snd_to_conn = onoff;
+ mutex_exit(&connp->conn_lock);
+ return (0);
}
break;
}
error = conn_opt_set(coa, level, name, inlen, invalp,
checkonly, cr);
*** 5908,5917 ****
--- 5918,5928 ----
int error = 0;
udp_stack_t *us = udp->udp_us;
ushort_t ipversion;
pid_t pid = curproc->p_pid;
ip_xmit_attr_t *ixa;
+ boolean_t snd_to_conn;
ASSERT(DB_TYPE(mp) == M_DATA);
/* All Solaris components should pass a cred for this operation. */
ASSERT(cr != NULL);
*** 5945,5958 ****
if (us->us_sendto_ignerr)
return (0);
else
return (error);
}
! if (udp->udp_state == TS_DATA_XFER) {
UDPS_BUMP_MIB(us, udpOutErrors);
return (EISCONN);
}
error = proto_verify_ip_addr(connp->conn_family,
(struct sockaddr *)msg->msg_name, msg->msg_namelen);
if (error != 0) {
UDPS_BUMP_MIB(us, udpOutErrors);
return (error);
--- 5956,5980 ----
if (us->us_sendto_ignerr)
return (0);
else
return (error);
}
!
! /*
! * Check if we're allowed to send to a connection on which we've
! * already called 'connect'. The posix spec. allows both behaviors but
! * historically we've returned an error if already connected. The
! * client can allow this via a sockopt.
! */
! mutex_enter(&connp->conn_lock);
! snd_to_conn = (udp->udp_snd_to_conn != 0);
! mutex_exit(&connp->conn_lock);
! if (udp->udp_state == TS_DATA_XFER && !snd_to_conn) {
UDPS_BUMP_MIB(us, udpOutErrors);
return (EISCONN);
}
+
error = proto_verify_ip_addr(connp->conn_family,
(struct sockaddr *)msg->msg_name, msg->msg_namelen);
if (error != 0) {
UDPS_BUMP_MIB(us, udpOutErrors);
return (error);