Print this page
6742 Freed and reused idm_conn_t buffer leads to system panic.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Steve Ping <steve.ping@nexenta.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
        
*** 20,29 ****
--- 20,30 ----
   */
  
  /*
   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
+  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
   */
  #ifndef _IDM_CONN_SM_H_
  #define _IDM_CONN_SM_H_
  
  #ifdef  __cplusplus
*** 217,226 ****
--- 218,253 ----
          "CS_S9B_WAIT_SND_DONE",
          "CS_MAX_STATE"
  };
  #endif
  
+ /*
+  * Currently the state machine has a condition where idm_login_timeout() is
+  * left active after the connection has been closed. This causes the system
+  * to panic when idm_login_timeout() modifies the freed memory. In an attempt
+  * to isolate and find this issue special attention is being placed on
+  * the ic_state_timeout value. After each untimeout call the value will now
+  * be cleared. Just before the value is set the code will check for 0 and
+  * display an error. One final change is being done in idm_conn_sm_fini() which
+  * if ic_state_machine is not 0, an error message will be displayed and
+  * untimeout() called. That should prevent customer sites from seeing the
+  * panic. The code also calls ASSERT(0) which should cause a panic during
+  * system test.
+  */
+ #define IDM_SM_TIMER_CHECK(ic) \
+         if (ic->ic_state_timeout) { \
+                 cmn_err(CE_WARN, "%s: existing timeout still set. " \
+                     "state: %s, last: %s\n", __func__, \
+                     idm_cs_name[ic->ic_state], \
+                     idm_cs_name[ic->ic_last_state]); \
+                 ASSERT(0); \
+         }
+ 
+ #define IDM_SM_TIMER_CLEAR(ic) \
+         (void) untimeout(ic->ic_state_timeout); \
+         ic->ic_state_timeout = 0;
+ 
  typedef enum {
          CT_NONE = 0,
          CT_RX_PDU,
          CT_TX_PDU
  } idm_pdu_event_type_t;