diff --git a/lib/reg/pn.c b/lib/reg/pn.c index 63cb0d88a56..da3ce06f430 100644 --- a/lib/reg/pn.c +++ b/lib/reg/pn.c @@ -278,7 +278,7 @@ enum pn_action pn_inspect_ct_params(struct sip_msg *req, const str *ct_uri) int i, is_cap_query = 1, is_handled_upstream = 0; if (parse_uri(ct_uri->s, ct_uri->len, &puri) != 0) { - LM_ERR("failed to parse URI: '%.*s'\n", ct_uri->len, ct_uri->s); + LM_ERR("failed to parse Contact URI '%.*s'\n", ct_uri->len, ct_uri->s); return -1; } @@ -357,12 +357,21 @@ next_param:; int pn_inspect_request(struct sip_msg *req, const str *ct_uri, struct save_ctx *sctx) { + int rc; + if (sctx->cmatch.mode != CT_MATCH_NONE) { LM_DBG("skip PN processing, matching mode already enforced\n"); return 0; } - switch (pn_inspect_ct_params(req, ct_uri)) { + rc = pn_inspect_ct_params(req, ct_uri); + if (rc < 0) { + rerrno = R_PARSE_CONT; + LM_DBG("failed to parse Contact URI\n"); + return -1; + } + + switch (rc) { case PN_NONE: LM_DBG("Contact URI has no PN params\n"); break; diff --git a/modules/mid_registrar/save.c b/modules/mid_registrar/save.c index 837974bbe5b..1a6d5ded779 100644 --- a/modules/mid_registrar/save.c +++ b/modules/mid_registrar/save.c @@ -2517,8 +2517,8 @@ int mid_reg_save(struct sip_msg *msg, udomain_t *d, str *flags_str, } if (pn_enable && pn_inspect_request(msg, &c->uri, &sctx) != 0) { - LM_DBG("SIP PN processing failed\n"); - goto quick_reply; + LM_DBG("SIP PN processing failed (%d)\n", rerrno); + goto out_error; } /* mid-registrar always rewrites the Contact, so any Path hf must go! */ diff --git a/modules/registrar/save.c b/modules/registrar/save.c index 720f1855347..a50dde51e0d 100644 --- a/modules/registrar/save.c +++ b/modules/registrar/save.c @@ -671,7 +671,7 @@ int save_aux(struct sip_msg* _m, str* forced_binding, void* _d, str* flags_s, } } else { if (pn_enable && pn_inspect_request(_m, &c->uri, &sctx) != 0) { - LM_DBG("SIP PN processing failed\n"); + LM_DBG("SIP PN processing failed (%d)\n", rerrno); goto error; } diff --git a/parser/parse_uri.c b/parser/parse_uri.c index 8a49154d4c7..364d91c1f27 100644 --- a/parser/parse_uri.c +++ b/parser/parse_uri.c @@ -543,6 +543,16 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) state=URI_PARAM_P; \ } \ break +#define param_xswitch1(old_state, c1, new_state) \ + case old_state: \ + switch(*p){ \ + case c1: \ + state=(new_state); \ + break; \ + default: \ + goto error_bad_char; \ + } \ + break #define param_switch_big(old_state, c1, c2, d1, d2, new_state_c, new_state_d) \ case old_state : \ switch(*p){ \ @@ -1239,7 +1249,7 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) /* pn-prid */ param_switch(PN2_I, 'd', 'D', PN2_D); - param_switch1(PN2_D, '=', PN2_eq); + param_xswitch1(PN2_D, '=', PN2_eq); case PN2_eq: param=&uri->pn_prid; param_val=&uri->pn_prid_val; @@ -1255,7 +1265,7 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) param_switch(PN3_A, 'r', 'R', PN3_R); param_switch(PN3_R, 'a', 'A', PN3_A2); param_switch(PN3_A2, 'm', 'M', PN3_M); - param_switch1(PN3_M, '=', PN3_eq); + param_xswitch1(PN3_M, '=', PN3_eq); case PN3_eq: param=&uri->pn_param; param_val=&uri->pn_param_val; @@ -1270,7 +1280,7 @@ int parse_uri(char* buf, int len, struct sip_uri* uri) /* pn-purr */ param_switch(PN4_U, 'r', 'R', PN4_R); param_switch(PN4_R, 'r', 'R', PN4_R2); - param_switch1(PN4_R2, '=', PN4_eq); + param_xswitch1(PN4_R2, '=', PN4_eq); case PN4_eq: param=&uri->pn_purr; param_val=&uri->pn_purr_val; diff --git a/parser/test/test_parser.c b/parser/test/test_parser.c index 67833f01bfa..3a1d06b8b4b 100644 --- a/parser/test/test_parser.c +++ b/parser/test/test_parser.c @@ -82,19 +82,25 @@ void test_parse_uri(void) in = *_str("sip:alice@atlanta.org;pn-prid="); ok(parse_uri(in.s, in.len, &u) != 0, "puri-29"); in = *_str("sip:alice@atlanta.org;pn-prid"); - ok(parse_uri(in.s, in.len, &u) != 0, "puri-30"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-30-1"); + in = *_str("sip:alice@atlanta.org;pn-prid;foo=bar"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-30-2"); /* pn-param value is mandatory */ in = *_str("sip:alice@atlanta.org;pn-param="); ok(parse_uri(in.s, in.len, &u) != 0, "puri-31"); in = *_str("sip:alice@atlanta.org;pn-param"); - ok(parse_uri(in.s, in.len, &u) != 0, "puri-32"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-32-1"); + in = *_str("sip:alice@atlanta.org;pn-param;foo=bar"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-32-2"); /* pn-purr value is mandatory */ in = *_str("sip:alice@atlanta.org;pn-purr="); ok(parse_uri(in.s, in.len, &u) != 0, "puri-33"); in = *_str("sip:alice@atlanta.org;pn-purr"); - ok(parse_uri(in.s, in.len, &u) != 0, "puri-34"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-34-1"); + in = *_str("sip:alice@atlanta.org;pn-purr;foo=bar"); + ok(parse_uri(in.s, in.len, &u) != 0, "puri-34-2"); in = *_str("sip:alice@atlanta.org;pn-provider=x;pn-prid=y;" "pn-param=z;pn-purr=t");