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);