summaryrefslogtreecommitdiff
path: root/third-party/pjproject/patches/0037-r5576-svn-backport-session-timer-crash.patch
blob: 098adcd354c1daef8c7820822df95193d0207399 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Index: pjproject/trunk/pjsip/src/pjsip-ua/sip_timer.c
===================================================================
--- a/pjsip/src/pjsip-ua/sip_timer.c	(revision 5557)
+++ b/pjsip/src/pjsip-ua/sip_timer.c	(revision 5576)
@@ -333,6 +333,8 @@
     pjsip_tx_data *tdata = NULL;
     pj_status_t status;
     pj_bool_t as_refresher;
+    int entry_id;
+    char obj_name[PJ_MAX_OBJ_NAME];
 
     pj_assert(inv);
 
@@ -344,7 +346,10 @@
     /* Check our role */
     as_refresher =
 	(inv->timer->refresher == TR_UAC && inv->timer->role == PJSIP_ROLE_UAC) ||
-	(inv->timer->refresher == TR_UAS && inv->timer->role == PJSIP_ROLE_UAS);    
+	(inv->timer->refresher == TR_UAS && inv->timer->role == PJSIP_ROLE_UAS);
+
+    entry_id = entry->id;
+    pj_ansi_strncpy(obj_name, inv->pool->obj_name, PJ_MAX_OBJ_NAME);
 
     /* Do action based on role(refresher or refreshee). 
      * As refresher:
@@ -353,7 +358,7 @@
      * As refreshee:
      * - end session if there is no refresh request received.
      */
-    if (as_refresher && (entry->id != REFRESHER_EXPIRE_TIMER_ID)) {
+    if (as_refresher && (entry_id != REFRESHER_EXPIRE_TIMER_ID)) {
 	pj_time_val now;
 
 	/* As refresher, reshedule the refresh request on the following:
@@ -414,7 +419,7 @@
 	}
 
 	pj_gettimeofday(&now);
-	PJ_LOG(4, (inv->pool->obj_name,
+	PJ_LOG(4, (obj_name,
 		   "Refreshing session after %ds (expiration period=%ds)",
 		   (now.sec-inv->timer->last_refresh.sec),
 		   inv->timer->setting.sess_expires));
@@ -432,7 +437,7 @@
 				       NULL, &tdata);
 
 	pj_gettimeofday(&now);
-	PJ_LOG(3, (inv->pool->obj_name, 
+	PJ_LOG(3, (obj_name,
 		   "No session %s received after %ds "
 		   "(expiration period=%ds), stopping session now!",
 		   (as_refresher?"refresh response":"refresh"),
@@ -451,11 +456,16 @@
 	status = pjsip_inv_send_msg(inv, tdata);	
     }
 
+    /*
+     * At this point, dialog might have already been destroyed,
+     * including its pool used by the invite session.
+     */
+
     /* Print error message, if any */
     if (status != PJ_SUCCESS) {
-	PJ_PERROR(2, (inv->pool->obj_name, status,
+	PJ_PERROR(2, (obj_name, status,
 		     "Error in %s session timer",
-		     ((as_refresher && entry->id != REFRESHER_EXPIRE_TIMER_ID)? 
+		     ((as_refresher && entry_id != REFRESHER_EXPIRE_TIMER_ID)?
 		       "refreshing" : "terminating")));
     }
 }