port dialplan regexp subst patch r8720,r8721,r9107,r9108

remotes/origin/3.3+ngcp2.6
Richard Fuchs 13 years ago
parent eb062850a6
commit ee6afa19d3

@ -277,7 +277,7 @@ static int dp_update(struct sip_msg * msg, pv_spec_t * src, pv_spec_t * dest,
int no_change; int no_change;
pv_value_t val; pv_value_t val;
no_change = (dest->type == PVT_NONE) || (!repl->s) || (!repl->len); no_change = (dest->type == PVT_NONE) || (!repl->s);
if (no_change) if (no_change)
goto set_attr_pvar; goto set_attr_pvar;

@ -147,12 +147,21 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
subst_comp = rule->subst_comp; subst_comp = rule->subst_comp;
repl_comp = rule->repl_comp; repl_comp = rule->repl_comp;
if(!repl_comp){ if (!subst_comp) {
LM_DBG("null replacement\n"); /*simply copy from the replacing string*/
if(!repl_comp || !repl_comp->replacement.s || repl_comp->replacement.len == 0){
LM_ERR("invalid replacing string\n");
goto error;
}
LM_DBG("simply replace the string, subst_comp %p, n_escapes %i\n",
subst_comp, repl_comp->n_escapes);
memcpy(result->s, repl_comp->replacement.s,
repl_comp->replacement.len);
result->len = repl_comp->replacement.len;
result->s[result->len] = '\0';
return 0; return 0;
} }
if(subst_comp){
/*just in case something went wrong at load time*/ /*just in case something went wrong at load time*/
rc = pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT, rc = pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT,
&cap_cnt); &cap_cnt);
@ -161,7 +170,7 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
rc); rc);
return -1;; return -1;;
} }
if(repl_comp->max_pmatch > cap_cnt){ if(repl_comp && repl_comp->max_pmatch > cap_cnt){
LM_ERR("illegal access to the %i-th subexpr of the subst expr\n", LM_ERR("illegal access to the %i-th subexpr of the subst expr\n",
repl_comp->max_pmatch); repl_comp->max_pmatch);
return -1; return -1;
@ -177,25 +186,20 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
rule->subst_exp.len, rule->subst_exp.s); rule->subst_exp.len, rule->subst_exp.s);
return -1; return -1;
} }
}
/*simply copy from the replacing string*/ /* copy non-matched prefix of string to output */
if(!subst_comp || (repl_comp->n_escapes <=0)){ if (ovector[0] > 0) {
if(!repl_comp->replacement.s || repl_comp->replacement.len == 0){ if (ovector[0] >= MAX_PHONE_NB_DIGITS) {
LM_ERR("invalid replacing string\n"); LM_ERR("overflow\n");
goto error; goto error;
} }
LM_DBG("simply replace the string, subst_comp %p, n_escapes %i\n", memcpy(result->s, string.s, ovector[0]);
subst_comp, repl_comp->n_escapes); result->len += ovector[0];
memcpy(result->s, repl_comp->replacement.s,
repl_comp->replacement.len);
result->len = repl_comp->replacement.len;
result->s[result->len] = '\0';
return 0;
} }
if (repl_comp) {
/* offset- offset in the replacement string */ /* offset- offset in the replacement string */
result->len = repl_nb = offset = 0; repl_nb = offset = 0;
p=repl_comp->replacement.s; p=repl_comp->replacement.s;
while( repl_nb < repl_comp->n_escapes){ while( repl_nb < repl_comp->n_escapes){
@ -290,7 +294,7 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
repl_nb++; repl_nb++;
} }
/* anything left? */ /* anything left? */
if( repl_nb && offset < repl_comp->replacement.len){ if(offset < repl_comp->replacement.len){
/*copy from the replacing string*/ /*copy from the replacing string*/
size = repl_comp->replacement.len - offset; size = repl_comp->replacement.len - offset;
memcpy(result->s + result->len, p + offset, size); memcpy(result->s + result->len, p + offset, size);
@ -298,6 +302,18 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
size, p + offset); size, p + offset);
result->len += size; result->len += size;
} }
}
/* copy non-matched suffix of string to output */
size = string.len - ovector[1];
if (size > 0) {
if (result->len + size >= MAX_PHONE_NB_DIGITS) {
LM_ERR("overflow\n");
goto error;
}
memcpy(result->s + result->len, string.s + ovector[1], size);
result->len += size;
}
result->s[result->len] = '\0'; result->s[result->len] = '\0';
return 0; return 0;

Loading…
Cancel
Save