Browse Source

Merge pull request #2484 from kamailio/jchavanton/dlg_missmatch

dialog: dlg_cell, always check for a to-tag match
Julien Chavanton 5 years ago
parent
commit
ba7d1d2e58
1 changed files with 14 additions and 2 deletions
  1. 14 2
      src/modules/dialog/dlg_hash.c

+ 14 - 2
src/modules/dialog/dlg_hash.c

@@ -865,6 +865,7 @@ static inline struct dlg_cell* internal_get_dlg(unsigned int h_entry,
 						unsigned int *dir, int mode)
 {
 	struct dlg_cell *dlg;
+	struct dlg_cell *dlg_no_totag=NULL;
 	struct dlg_entry *d_entry;
 
 	d_entry = &(d_table->entries[h_entry]);
@@ -876,13 +877,24 @@ static inline struct dlg_cell* internal_get_dlg(unsigned int h_entry,
 		if (match_dialog( dlg, callid, ftag, ttag, dir)==1) {
 			ref_dlg_unsafe(dlg, 1);
 			if(likely(mode==0)) dlg_unlock( d_table, d_entry);
-			LM_DBG("dialog callid='%.*s' found on entry %u, dir=%d\n",
-				callid->len, callid->s,h_entry,*dir);
+
+			/* If to-tag is empty continue to search in case another dialog is found with a matching to-tag. */
+			if (dlg->tag[1].len == 0) {
+				dlg_no_totag=dlg;
+				LM_DBG("dialog callid='%.*s' found on entry %u, dir=%d\n",
+					callid->len, callid->s,h_entry,*dir);
+				continue;
+			}
+			LM_DBG("dialog callid='%.*s' found on entry %u, dir=%d to-tag='%.*s'\n",
+				callid->len, callid->s,h_entry,*dir, dlg->tag[1].len, dlg->tag[1].s);
+
 			return dlg;
 		}
 	}
 
 	if(likely(mode==0)) dlg_unlock( d_table, d_entry);
+	if (dlg_no_totag) return dlg_no_totag;
+
 	LM_DBG("no dialog callid='%.*s' found\n", callid->len, callid->s);
 	return 0;
 }