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

Author: Andrei Pelinescu-Onciul <[email protected]>
Committer: Andrei Pelinescu-Onciul <[email protected]>
Date:   Sat Jul 18 10:05:16 2009 +0200

core: expr string length fixup fix

- moved the string length fixup before the rve/rval optimisations:
  the string length fixup was executed after the rve/rval
  optimisations and would try to re-calculate the length of the
  string (which was already filled in by the optimizer). However
  the rval optimizer did not 0-terminate strings => this second
  re-calculation was wrong.

- the rve/rval optimiser 0 terminates strings (although not
  strictly needed it's better for debugging and would avoid
  problems similar to the above one).

- don't try to fix a string in the left side of an expression,
  there can be no strings there (and by chance
  METHOD_O==STRING_ST).

Reported-by: Juha Heinanen  jh at tutpro com

---

 route.c |   30 +++++++++++++-----------------
 1 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/route.c b/route.c
index effb608..7c01a3b 100644
--- a/route.c
+++ b/route.c
@@ -435,6 +435,7 @@ static int exp_optimize_right(struct expr* exp)
                                        if (exp->r.str.s){
                                                exp->r.str.len=rval->v.s.len;
                                                memcpy(exp->r.str.s, 
rval->v.s.s, rval->v.s.len);
+                                               exp->r.str.s[exp->r.str.len]=0;
                                                exp->r_type=STRING_ST;
                                                rval_destroy(rval);
                                                pkg_free(rve);
@@ -503,6 +504,7 @@ int fix_expr(struct expr* exp)
 {
        regex_t* re;
        int ret;
+       int len;
 
        ret=E_BUG;
        if (exp==0){
@@ -525,8 +527,17 @@ int fix_expr(struct expr* exp)
                                                                exp->op);
                }
        }else if (exp->type==ELEM_T){
-                       /* first fix & optimize rve/rvals (they might be 
optimized
-                          to non-rvals, e.g. string, avp a.s.o) */
+                       /* first calculate lengths of strings  (only right 
side, since 
+                         left side can never be a string) */
+                       if (exp->r_type==STRING_ST) {
+                               if (exp->r.string) len = strlen(exp->r.string);
+                               else len = 0;
+                               exp->r.str.s = exp->r.string;
+                               exp->r.str.len = len;
+                       }
+                       /* then fix & optimize rve/rvals (they might be 
optimized
+                          to non-rvals, e.g. string, avp a.s.o and needs to be 
done
+                          before MATCH_OP and other fixups) */
                        if (exp->l_type==RVEXP_O){
                                if ((ret=fix_rval_expr(&exp->l.param))<0){
                                        ERR("Unable to fix left rval 
expression\n");
@@ -544,21 +555,6 @@ int fix_expr(struct expr* exp)
                                        exp_optimize_right(exp);
                        }
                        
-                       /* Calculate lengths of strings */
-                       if (exp->l_type==STRING_ST) {
-                               int len;
-                               if (exp->l.string) len = strlen(exp->l.string);
-                               else len = 0;
-                               exp->l.str.s = exp->l.string;
-                               exp->l.str.len = len;
-                       }
-                       if (exp->r_type==STRING_ST) {
-                               int len;
-                               if (exp->r.string) len = strlen(exp->r.string);
-                               else len = 0;
-                               exp->r.str.s = exp->r.string;
-                               exp->r.str.len = len;
-                       }
                        
                        if (exp->op==MATCH_OP){
                                     /* right side either has to be string, in 
which case


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

Reply via email to