MFC r293828:
Store the timer type for logging, because the timer can be freed during processing the timerout.
This commit is contained in:
parent
51d567a324
commit
a1b057e476
@ -1495,6 +1495,7 @@ sctp_timeout_handler(void *t)
|
||||
|
||||
#endif
|
||||
int did_output;
|
||||
int type;
|
||||
|
||||
tmr = (struct sctp_timer *)t;
|
||||
inp = (struct sctp_inpcb *)tmr->ep;
|
||||
@ -1563,8 +1564,9 @@ sctp_timeout_handler(void *t)
|
||||
return;
|
||||
}
|
||||
}
|
||||
type = tmr->type;
|
||||
tmr->stopped_from = 0xa005;
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "Timer type %d goes off\n", tmr->type);
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "Timer type %d goes off\n", type);
|
||||
if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) {
|
||||
if (inp) {
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
@ -1580,7 +1582,7 @@ sctp_timeout_handler(void *t)
|
||||
if (stcb) {
|
||||
SCTP_TCB_LOCK(stcb);
|
||||
atomic_add_int(&stcb->asoc.refcnt, -1);
|
||||
if ((tmr->type != SCTP_TIMER_TYPE_ASOCKILL) &&
|
||||
if ((type != SCTP_TIMER_TYPE_ASOCKILL) &&
|
||||
((stcb->asoc.state == 0) ||
|
||||
(stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED))) {
|
||||
SCTP_TCB_UNLOCK(stcb);
|
||||
@ -1592,7 +1594,7 @@ sctp_timeout_handler(void *t)
|
||||
}
|
||||
}
|
||||
/* record in stopped what t-o occured */
|
||||
tmr->stopped_from = tmr->type;
|
||||
tmr->stopped_from = type;
|
||||
|
||||
/* mark as being serviced now */
|
||||
if (SCTP_OS_TIMER_PENDING(&tmr->timer)) {
|
||||
@ -1610,7 +1612,7 @@ sctp_timeout_handler(void *t)
|
||||
SCTP_OS_TIMER_DEACTIVATE(&tmr->timer);
|
||||
|
||||
/* call the handler for the appropriate timer type */
|
||||
switch (tmr->type) {
|
||||
switch (type) {
|
||||
case SCTP_TIMER_TYPE_ZERO_COPY:
|
||||
if (inp == NULL) {
|
||||
break;
|
||||
@ -1894,11 +1896,11 @@ sctp_timeout_handler(void *t)
|
||||
goto out_no_decr;
|
||||
default:
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "sctp_timeout_handler:unknown timer %d\n",
|
||||
tmr->type);
|
||||
type);
|
||||
break;
|
||||
}
|
||||
#ifdef SCTP_AUDITING_ENABLED
|
||||
sctp_audit_log(0xF1, (uint8_t) tmr->type);
|
||||
sctp_audit_log(0xF1, (uint8_t) type);
|
||||
if (inp)
|
||||
sctp_auditing(5, inp, stcb, net);
|
||||
#endif
|
||||
@ -1921,8 +1923,7 @@ out_decr:
|
||||
SCTP_INP_DECR_REF(inp);
|
||||
}
|
||||
out_no_decr:
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "Timer now complete (type %d)\n",
|
||||
tmr->type);
|
||||
SCTPDBG(SCTP_DEBUG_TIMER1, "Timer now complete (type = %d)\n", type);
|
||||
CURVNET_RESTORE();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user