Browse Source

core: save and restore branch_iterator in print_dset

- safe usage in branch_route where branch_interator is used to add the
  new brnaches, but some variables can change it if used in config
  branch_route
- closes FS#182, reported by Pawel Sternal
(cherry picked from commit c5f101dfac9a50f428e3452893c402d8b1e0400b)
Daniel-Constantin Mierla 13 years ago
parent
commit
d44956c4f3
2 changed files with 26 additions and 3 deletions
  1. 20 1
      dset.c
  2. 6 2
      dset.h

+ 20 - 1
dset.c

@@ -191,11 +191,21 @@ void init_branch_iterator(void)
 	branch_iterator = 0;
 }
 
+/**
+ * return the value of current branch iterator
+ */
 int get_branch_iterator(void)
 {
 	return branch_iterator;
 }
 
+/**
+ * set the value of current branch interator
+ */
+void set_branch_iterator(int n)
+{
+	branch_iterator = n;
+}
 
 
 /** \brief Get a branch from the destination set
@@ -366,6 +376,7 @@ char* print_dset(struct sip_msg* msg, int* len)
 	qvalue_t q;
 	str uri;
 	char* p, *qbuf;
+	int crt_branch;
 	static char dset[MAX_REDIRECTION_LEN];
 
 	if (msg->new_uri.s) {
@@ -379,6 +390,9 @@ char* print_dset(struct sip_msg* msg, int* len)
 		*len = 0;
 	}
 
+	/* backup current branch index to restore it later */
+	crt_branch = get_branch_iterator();
+
 	init_branch_iterator();
 	while ((uri.s = next_branch(&uri.len, &q, 0, 0, 0, 0))) {
 		cnt++;
@@ -394,7 +408,7 @@ char* print_dset(struct sip_msg* msg, int* len)
 
 	if (*len + 1 > MAX_REDIRECTION_LEN) {
 		LOG(L_ERR, "ERROR: redirection buffer length exceed\n");
-		return 0;
+		goto error;
 	}
 
 	memcpy(dset, CONTACT, CONTACT_LEN);
@@ -445,7 +459,12 @@ char* print_dset(struct sip_msg* msg, int* len)
 	}
 
 	memcpy(p, CRLF " ", CRLF_LEN + 1);
+	set_branch_iterator(crt_branch);
 	return dset;
+
+error:
+	set_branch_iterator(crt_branch);
+	return 0;
 }
 
 

+ 6 - 2
dset.h

@@ -107,15 +107,19 @@ static inline int ser_append_branch(struct sip_msg* msg,
 
 
 /*! \brief
- * Iterate through the list of transaction branches 
+ * Init the index to iterate through the list of transaction branches
  */
 void init_branch_iterator(void);
 
 /*! \brief
- * Return branch iterator position 
+ * Return branch iterator position
  */
 int get_branch_iterator(void);
 
+/*! \brief
+ * Set branch iterator position
+ */
+void set_branch_iterator(int n);
 
 /*! \brief Get the next branch in the current transaction.
  * @return pointer to the uri of the next branch (which the length written in