瀏覽代碼

avpops: allow use of avps as second parameter on re operation at avp_check function

Victor Seva 12 年之前
父節點
當前提交
bbecaa597a
共有 2 個文件被更改,包括 31 次插入24 次删除
  1. 15 20
      modules/avpops/avpops.c
  2. 16 4
      modules/avpops/avpops_impl.c

+ 15 - 20
modules/avpops/avpops.c

@@ -683,28 +683,23 @@ static int fixup_check_avp(void** param, int param_no)
 		/* if REGEXP op -> compile the expresion */
 		if (ap->ops&AVPOPS_OP_RE)
 		{
-			if ( (ap->opd&AVPOPS_VAL_STR)==0 )
+			if ( (ap->opd&AVPOPS_VAL_STR)!=0 )
 			{
-				LM_ERR("regexp operation requires string value\n");
-				return E_UNSPEC;
-			}
-			re = pkg_malloc(sizeof(regex_t));
-			if (re==0)
-			{
-				LM_ERR("no more pkg mem\n");
-				return E_OUT_OF_MEM;
-			}
-			LM_DBG("compiling regexp <%.*s>\n", ap->u.s.len, ap->u.s.s);
-			if (regcomp(re, ap->u.s.s,
-						REG_EXTENDED|REG_ICASE|REG_NEWLINE))
-			{
-				pkg_free(re);
-				LM_ERR("bad re <%.*s>\n", ap->u.s.len, ap->u.s.s);
-				return E_BAD_RE;
+				re = (regex_t*) pkg_malloc(sizeof(regex_t));
+				if (re==0)
+				{
+					LM_ERR("no more pkg mem\n");
+					return E_OUT_OF_MEM;
+				}
+				LM_DBG("compiling regexp <%.*s>\n", ap->u.s.len, ap->u.s.s);
+				if (regcomp(re, ap->u.s.s,REG_EXTENDED|REG_ICASE|REG_NEWLINE))
+				{
+					pkg_free(re);
+					LM_ERR("bad re <%.*s>\n", ap->u.s.len, ap->u.s.s);
+					return E_BAD_RE;
+				}
+				ap->u.s.s = (char*)re;
 			}
-			/* free the string and link the regexp */
-			// pkg_free(ap->sval.p.s);
-			ap->u.s.s = (char*)re;
 		} else if (ap->ops&AVPOPS_OP_FM) {
 			if ( !( ap->opd&AVPOPS_VAL_PVAR ||
 			(!(ap->opd&AVPOPS_VAL_PVAR) && ap->opd&AVPOPS_VAL_STR) ) )

+ 16 - 4
modules/avpops/avpops_impl.c

@@ -1069,6 +1069,8 @@ int ops_check_avp( struct sip_msg* msg, struct fis_param* src,
 	int            flags;
 	pv_value_t     xvalue;
 	char           backup;
+	regex_t	       re_temp;
+	regex_t	       *re;
 
 	/* look if the required avp(s) is/are present */
 	if(src->u.sval.type==PVT_AVP)
@@ -1228,14 +1230,24 @@ cycle2:
 			if (strncasecmp(avp_val.s.s,check_val.s.s,n)>=0)
 				return 1;
 		} else if (val->ops&AVPOPS_OP_RE) {
+			if (val->opd&AVPOPS_VAL_PVAR) {
+				LM_DBG("compiling regexp <%.*s>\n", check_val.s.len, check_val.s.s);
+				if (regcomp(&re_temp, check_val.s.s,REG_EXTENDED|REG_ICASE|REG_NEWLINE))
+				{
+					LM_ERR("bad re <%.*s>\n", check_val.s.len, check_val.s.s);
+					goto next;
+				}
+				re = &re_temp;
+			}
+			else re = (regex_t*)check_val.s.s;
 			backup  = avp_val.s.s[avp_val.s.len];
 			avp_val.s.s[avp_val.s.len] = '\0';
-			if (regexec((regex_t*)check_val.s.s, avp_val.s.s, 1, &pmatch,0)==0)
-			{
-				avp_val.s.s[avp_val.s.len] = backup;
-				return 1;
+			rt=regexec(re, avp_val.s.s, 1, &pmatch,0);
+			if (val->opd&AVPOPS_VAL_PVAR) {
+				regfree(re);
 			}
 			avp_val.s.s[avp_val.s.len] = backup;
+			if (rt==0) return 1;
 		} else if (val->ops&AVPOPS_OP_FM){
 			backup  = avp_val.s.s[avp_val.s.len];
 			avp_val.s.s[avp_val.s.len] = '\0';