Переглянути джерело

dialog: don't send keepalive if dialog not in confirmed state

- if dialog is in deleted state, remove it from keep alive list
  immediately
Daniel-Constantin Mierla 10 роки тому
батько
коміт
0e22abe2b8
1 змінених файлів з 10 додано та 3 видалено
  1. 10 3
      modules/dialog/dlg_hash.c

+ 10 - 3
modules/dialog/dlg_hash.c

@@ -169,8 +169,9 @@ int dlg_ka_run(ticks_t ti)
 		if(*dlg_ka_list_head == *dlg_ka_list_tail) {
 			*dlg_ka_list_head = NULL;
 			*dlg_ka_list_tail = NULL;
+		} else {
+			*dlg_ka_list_head = dka->next;
 		}
-		*dlg_ka_list_head = dka->next;
 		lock_release(dlg_ka_list_lock);
 
 		/* send keep-alive for dka */
@@ -179,10 +180,16 @@ int dlg_ka_run(ticks_t ti)
 			shm_free(dka);
 			dka = NULL;
 		} else {
-			if(dka->iflags & DLG_IFLAG_KA_SRC)
+			if((dka->iflags & DLG_IFLAG_KA_SRC)
+					&& (dlg->state==DLG_STATE_CONFIRMED))
 				dlg_send_ka(dlg, DLG_CALLER_LEG);
-			if(dka->iflags & DLG_IFLAG_KA_DST)
+			if((dka->iflags & DLG_IFLAG_KA_DST)
+					&& (dlg->state==DLG_STATE_CONFIRMED))
 				dlg_send_ka(dlg, DLG_CALLEE_LEG);
+			if(dlg->state==DLG_STATE_DELETED) {
+				shm_free(dka);
+				dka = NULL;
+			}
 			dlg_release(dlg);
 		}
 		/* append to tail */