- Fixes a case where doing a sysctl would leave locks held

when coping out association data.
- Fixes a small bug that prevented the SCTP_UNORDERED indication
  from going up to the app on a recv in the sinfo_flags field.
This commit is contained in:
Randall Stewart 2007-06-06 00:40:41 +00:00
parent 34a1405271
commit 5f26a41d17
2 changed files with 13 additions and 1 deletions

View File

@ -192,6 +192,8 @@ copy_out_local_addresses(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct s
/* neither Mac OS X nor FreeBSD support mulitple routing functions */
if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) {
SCTP_INP_RUNLOCK(inp);
SCTP_INP_INFO_RUNLOCK();
return (-1);
}
if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
@ -273,11 +275,18 @@ copy_out_local_addresses(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct s
}
memset((void *)&xladdr, 0, sizeof(union sctp_sockstore));
xladdr.last = 1;
SCTP_INP_RUNLOCK(inp);
SCTP_INP_INFO_RUNLOCK();
error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr));
if (error)
return (error);
else
else {
SCTP_INP_INFO_RLOCK();
SCTP_INP_RLOCK(inp);
return (0);
}
}
/*

View File

@ -5027,6 +5027,9 @@ sctp_sorecvmsg(struct socket *so,
* there.
*/
sinfo->sinfo_flags &= 0x00ff;
if ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) {
sinfo->sinfo_flags |= SCTP_UNORDERED;
}
}
if (fromlen && from) {
struct sockaddr *to;