Module: kamailio
Branch: master
Commit: f789f6a5fa4d651ad3bcb657cb2a1dc765de6460
URL: 
https://github.com/kamailio/kamailio/commit/f789f6a5fa4d651ad3bcb657cb2a1dc765de6460

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date: 2025-06-12T17:43:20+02:00

core: parser - count diversion header body len based on last param

- take in consideratio quoted param values

---

Modified: src/core/parser/parse_diversion.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/f789f6a5fa4d651ad3bcb657cb2a1dc765de6460.diff
Patch: 
https://github.com/kamailio/kamailio/commit/f789f6a5fa4d651ad3bcb657cb2a1dc765de6460.patch

---

diff --git a/src/core/parser/parse_diversion.c 
b/src/core/parser/parse_diversion.c
index 1b5d70a5f80..098ae19afa6 100644
--- a/src/core/parser/parse_diversion.c
+++ b/src/core/parser/parse_diversion.c
@@ -52,10 +52,10 @@ int parse_diversion_body(char *buf, int len, 
diversion_body_t **body)
 {
        static to_body_t uri_b[NUM_DIVERSION_BODIES]; /* Temporary storage */
        int num_uri = 0;
-       int body_len = 0;
        char *tmp;
        int i;
        to_param_t *params;
+       to_param_t *lparam;
 
        memset(uri_b, 0, NUM_DIVERSION_BODIES * sizeof(to_body_t));
 
@@ -66,17 +66,27 @@ int parse_diversion_body(char *buf, int len, 
diversion_body_t **body)
        }
 
        /* id.body should contain all info including uri and params */
-       body_len = uri_b[num_uri].body.len;
-
        /* Loop over all params */
        params = uri_b[num_uri].param_lst;
+       lparam = NULL;
        while(params) {
-               body_len +=
-                               params->name.len + params->value.len + 2; // 2 
for '=' and ';'
+               lparam = params;
                params = params->next;
        }
 
-       uri_b[num_uri].body.len = body_len;
+       if(lparam) {
+               if(lparam->value.len > 0) {
+                       uri_b[num_uri].body.len =
+                                       lparam->value.s + lparam->value.len - 
uri_b[num_uri].body.s;
+                       if(*(lparam->value.s - 1) == '"'
+                                       || *(lparam->value.s - 1) == '\'') {
+                               uri_b[num_uri].body.len++;
+                       }
+               } else {
+                       uri_b[num_uri].body.len =
+                                       lparam->name.s + lparam->name.len - 
uri_b[num_uri].body.s;
+               }
+       }
 
        num_uri++;
        while(*tmp == ',' && (num_uri < NUM_DIVERSION_BODIES)) {
@@ -132,17 +142,25 @@ int parse_diversion_body(char *buf, int len, 
diversion_body_t **body)
                }
 
                /* id.body should contain all info including uri and params */
-               body_len = uri_b[num_uri].body.len;
-
                /* Loop over all params */
                params = uri_b[num_uri].param_lst;
                while(params) {
-                       body_len += params->name.len + params->value.len
-                                               + 2; /*  2 for '=' and ';' */
+                       lparam = params;
                        params = params->next;
                }
-
-               uri_b[num_uri].body.len = body_len;
+               if(lparam) {
+                       if(lparam->value.len > 0) {
+                               uri_b[num_uri].body.len = lparam->value.s + 
lparam->value.len
+                                                                               
  - uri_b[num_uri].body.s;
+                               if(*(lparam->value.s - 1) == '"'
+                                               || *(lparam->value.s - 1) == 
'\'') {
+                                       uri_b[num_uri].body.len++;
+                               }
+                       } else {
+                               uri_b[num_uri].body.len = lparam->name.s + 
lparam->name.len
+                                                                               
  - uri_b[num_uri].body.s;
+                       }
+               }
 
                num_uri++;
        }

_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to