Module: kamailio
Branch: master
Commit: 47f1ff4d31101c8a8d16a08b3c2f1069b85b3d47
URL:
https://github.com/kamailio/kamailio/commit/47f1ff4d31101c8a8d16a08b3c2f106…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2016-11-02T09:39:57+01:00
core: parser/parse_diversion - allow comma separated bodies
- still only the first body is cacshed in msg->diversion
- reported by GH #841
---
Modified: parser/parse_diversion.c
---
Diff:
https://github.com/kamailio/kamailio/commit/47f1ff4d31101c8a8d16a08b3c2f106…
Patch:
https://github.com/kamailio/kamailio/commit/47f1ff4d31101c8a8d16a08b3c2f106…
---
diff --git a/parser/parse_diversion.c b/parser/parse_diversion.c
index cc60600..4578087 100644
--- a/parser/parse_diversion.c
+++ b/parser/parse_diversion.c
@@ -13,20 +13,21 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ *
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*! \file
* \brief Parser :: Diversion header
- *
+ *
* \ingroup parser
*/
-
+
#include <stdlib.h>
-#include <string.h>
+#include <string.h>
#include "../dprint.h"
#include "../ut.h"
#include "../mem/mem.h"
@@ -40,41 +41,49 @@
* params: msg : sip msg
* returns 0 on success,
* -1 on failure.
+ *
+ * limitations: it parses only the first occurence
*/
int parse_diversion_header(struct sip_msg *msg)
{
- struct to_body* diversion_b;
-
- if (!msg->diversion && (parse_headers(msg, HDR_DIVERSION_F, 0) == -1 ||
- !msg->diversion)) {
- goto error;
- }
-
- /* maybe the header is already parsed! */
- if (msg->diversion->parsed)
- return 0;
-
- /* bad luck! :-( - we have to parse it */
- /* first, get some memory */
- diversion_b = pkg_malloc(sizeof(struct to_body));
- if (diversion_b == 0) {
- LOG(L_ERR, "ERROR:parse_diversion_header: out of pkg_memory\n");
- goto error;
- }
-
- /* now parse it!! */
- memset(diversion_b, 0, sizeof(struct to_body));
- parse_to(msg->diversion->body.s, msg->diversion->body.s +
msg->diversion->body.len + 1, diversion_b);
- if (diversion_b->error == PARSE_ERROR) {
- LOG(L_ERR, "ERROR:parse_diversion_header: bad diversion header\n");
- free_to(diversion_b);
- goto error;
- }
- msg->diversion->parsed = diversion_b;
-
- return 0;
- error:
- return -1;
+ struct to_body* diversion_b;
+
+ if (!msg->diversion && (parse_headers(msg, HDR_DIVERSION_F, 0) == -1)) {
+ goto error;
+ }
+
+ if (!msg->diversion) {
+ /* header not found */
+ return -1;
+ }
+
+ /* maybe the header is already parsed! */
+ if (msg->diversion->parsed)
+ return 0;
+
+ /* bad luck! :-( - we have to parse it */
+ /* first, get some memory */
+ diversion_b = pkg_malloc(sizeof(struct to_body));
+ if (diversion_b == 0) {
+ LM_ERR("out of pkg_memory\n");
+ goto error;
+ }
+
+ /* now parse it!! */
+ memset(diversion_b, 0, sizeof(struct to_body));
+ parse_addr_spec(msg->diversion->body.s,
+ msg->diversion->body.s + msg->diversion->body.len + 1,
+ diversion_b, 1);
+ if (diversion_b->error == PARSE_ERROR) {
+ LM_ERR("bad diversion header\n");
+ free_to(diversion_b);
+ goto error;
+ }
+ msg->diversion->parsed = diversion_b;
+
+ return 0;
+error:
+ return -1;
}
@@ -83,22 +92,22 @@ int parse_diversion_header(struct sip_msg *msg)
*/
str *get_diversion_param(struct sip_msg *msg, str* name)
{
- struct to_param *params;
+ struct to_param *params;
- if (parse_diversion_header(msg) < 0) {
- ERR("could not get diversion parameter\n");
+ if (parse_diversion_header(msg) < 0) {
+ LM_ERR("could not get diversion parameter\n");
return 0;
- }
+ }
- params = ((struct to_body*)(msg->diversion->parsed))->param_lst;
+ params = ((struct to_body*)(msg->diversion->parsed))->param_lst;
- while (params) {
+ while (params) {
if ((params->name.len == name->len) &&
- (strncmp(params->name.s, name->s, name->len) == 0)) {
+ (strncmp(params->name.s, name->s, name->len) == 0)) {
return ¶ms->value;
}
params = params->next;
- }
-
- return 0;
+ }
+
+ return 0;
}