Fixes two bugs:

1) A lock issue, if we ever had to try again
   we would double lock the INP lock.
2) We were allowing (at wrap) associd 0... which really
   we cannot allow since 0 normally means in most socket
   API calls that we are wishing to effect something on
   the INP not TCB.

MFC after:	1 week
This commit is contained in:
Randall Stewart 2009-09-13 17:45:31 +00:00
parent 8a2c4db0fe
commit f3d06a3c68

View File

@ -3926,12 +3926,20 @@ sctp_aloc_a_assoc_id(struct sctp_inpcb *inp, struct sctp_tcb *stcb)
struct sctpasochead *head;
struct sctp_tcb *lstcb;
SCTP_INP_WLOCK(inp);
try_again:
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) {
/* TSNH */
SCTP_INP_WUNLOCK(inp);
return (0);
}
SCTP_INP_WLOCK(inp);
/*
* We don't allow assoc id to be 0, this is needed otherwise if the
* id were to wrap we would have issues with some socket options.
*/
if (inp->sctp_associd_counter == 0) {
inp->sctp_associd_counter++;
}
id = inp->sctp_associd_counter;
inp->sctp_associd_counter++;
lstcb = sctp_findasoc_ep_asocid_locked(inp, (sctp_assoc_t) id, 0);