Author: tuexen
Date: Sun Jan 17 14:00:24 2016
New Revision: 294221
URL: https://svnweb.freebsd.org/changeset/base/294221

Log:
  MFC r293828:
  Store the timer type for logging, because the timer can be freed
  during processing the timerout.

Modified:
  stable/10/sys/netinet/sctputil.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet/sctputil.c
==============================================================================
--- stable/10/sys/netinet/sctputil.c    Sun Jan 17 12:41:46 2016        
(r294220)
+++ stable/10/sys/netinet/sctputil.c    Sun Jan 17 14:00:24 2016        
(r294221)
@@ -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();
 }
 
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to