Module: sip-router
Branch: master
Commit: 6299704ebb280214f35fc86968d86be972219e51
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6299704ebb280214f35fc86968d86be972219e51

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date:   Thu Nov 24 17:22:26 2011 +0100

parser: don't free on error To param linked in to_body struct

- if a To header parameter was already linked in to_body struct, don't
  free if there is a parsing error for it later, it will be freed by
  free_to_params()
- reported by Bayan Towfiq in FS#180

---

 parser/parse_to.c |   36 +++++++++++++++++-------------------
 1 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/parser/parse_to.c b/parser/parse_to.c
index bcd0bd0..cb2ea75 100644
--- a/parser/parse_to.c
+++ b/parser/parse_to.c
@@ -53,7 +53,7 @@ enum {
 
 
 
-#define add_param( _param , _body ) \
+#define add_param( _param , _body , _newparam ) \
        do{\
                DBG("DEBUG: add_param: 
%.*s=%.*s\n",param->name.len,ZSW(param->name.s),\
                        param->value.len,ZSW(param->value.s));\
@@ -62,6 +62,7 @@ enum {
                (_body)->last_param =(_param);\
                if ((_param)->type==TAG_PARAM)\
                        
memcpy(&((_body)->tag_value),&((_param)->value),sizeof(str));\
+               _newparam = 0;\
        }while(0);
 
 
@@ -73,11 +74,13 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                        int *returned_status)
 {
        struct to_param *param;
+       struct to_param *newparam;
        int status;
        int saved_status;
        char  *tmp;
 
        param=0;
+       newparam=0;
        status=E_PARA_VALUE;
        saved_status=E_PARA_VALUE;
        for( tmp=buffer; tmp<end; tmp++)
@@ -99,7 +102,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                        case PARA_VALUE_TOKEN:
                                                param->value.len = 
tmp-param->value.s;
                                                status = E_PARA_VALUE;
-                                               add_param( param , to_b );
+                                               add_param(param, to_b, 
newparam);
                                                break;
                                        case F_CRLF:
                                        case F_LF:
@@ -132,7 +135,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                                param->value.len = 
tmp-param->value.s;
                                                saved_status = E_PARA_VALUE;
                                                status = F_LF;
-                                               add_param( param , to_b );
+                                               add_param(param, to_b, 
newparam);
                                                break;
                                        case F_CR:
                                                status=F_CRLF;
@@ -171,7 +174,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                                param->value.len = 
tmp-param->value.s;
                                                saved_status = E_PARA_VALUE;
                                                status = F_CR;
-                                               add_param( param , to_b );
+                                               add_param(param, to_b, 
newparam);
                                                break;
                                        case F_CRLF:
                                        case F_CR:
@@ -202,7 +205,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                        case PARA_VALUE_TOKEN:
                                                status = E_PARA_VALUE;
                                                param->value.len = 
tmp-param->value.s;
-                                               add_param( param , to_b );
+                                               add_param(param , to_b, 
newparam);
                                        case E_PARA_VALUE:
                                                saved_status = status;
                                                goto endofheader;
@@ -242,7 +245,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                                break;
                                        case PARA_VALUE_QUOTED:
                                                
param->value.len=tmp-param->value.s;
-                                               add_param( param , to_b );
+                                               add_param(param, to_b, 
newparam);
                                                status = E_PARA_VALUE;
                                                break;
                                        case F_CRLF:
@@ -277,7 +280,7 @@ static /*inline*/ char* parse_to_param(char *buffer, char 
*end,
                                        case PARA_VALUE_TOKEN:
                                                
param->value.len=tmp-param->value.s;
 semicolon_add_param:
-                                               add_param(param,to_b);
+                                               add_param(param, to_b, 
newparam);
                                        case E_PARA_VALUE:
                                                param = (struct to_param*)
                                                        
pkg_malloc(sizeof(struct to_param));
@@ -289,6 +292,8 @@ semicolon_add_param:
                                                memset(param,0,sizeof(struct 
to_param));
                                                param->type=GENERAL_PARAM;
                                                status = S_PARA_NAME;
+                                               /* link to free mem if not 
added in to_body list */
+                                               newparam = param;
                                                break;
                                        case F_CRLF:
                                        case F_LF:
@@ -483,19 +488,19 @@ endofheader:
                        /* parameter without '=', e.g. foo */
                        param->value.s=0;
                        param->value.len=0;
-                       add_param(param, to_b);
+                       add_param(param, to_b, newparam);
                        saved_status=E_PARA_VALUE;
                        break;
                case S_PARA_VALUE:
                        /* parameter with null value, e.g. foo= */
                        param->value.s=tmp;
                        param->value.len=0;
-                       add_param(param, to_b);
+                       add_param(param, to_b, newparam);
                        saved_status=E_PARA_VALUE;
                        break;
                case PARA_VALUE_TOKEN:
                        param->value.len=tmp-param->value.s;
-                       add_param(param, to_b);
+                       add_param(param, to_b, newparam);
                        saved_status=E_PARA_VALUE;
                        break;
                case E_PARA_VALUE:
@@ -510,7 +515,7 @@ endofheader:
        return tmp;
 
 error:
-       if (param) pkg_free(param);
+       if (newparam) pkg_free(newparam);
        to_b->error=PARSE_ERROR;
        *returned_status = status;
        return tmp;
@@ -527,15 +532,8 @@ char* parse_to(char* buffer, char *end, struct to_body 
*to_b)
        
        saved_status=START_TO; /* fixes gcc 4.x warning */
        status=START_TO;
+       memset(to_b, 0, sizeof(struct to_body));
        to_b->error=PARSE_OK;
-       to_b->uri.len = 0;
-       to_b->uri.s= 0;
-       to_b->display.len = 0;
-       to_b->display.s = 0;
-       to_b->tag_value.len = 0;
-       to_b->tag_value.s = 0;
-       to_b->param_lst = 0;
-       to_b->last_param = 0;
        foo=0;
 
        for( tmp=buffer; tmp<end; tmp++)


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to