Skip to content

Commit

Permalink
SIP PN support: Add detection for pn-* params with no value
Browse files Browse the repository at this point in the history
This is a client-side error condition and the server must reply with
"400 Bad Request".

(cherry picked from commit 55eae8f)
  • Loading branch information
liviuchircu committed Nov 3, 2020
1 parent 74a180d commit 229c5da
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 11 deletions.
13 changes: 11 additions & 2 deletions lib/reg/pn.c
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions modules/mid_registrar/save.c
Expand Up @@ -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! */
Expand Down
2 changes: 1 addition & 1 deletion modules/registrar/save.c
Expand Up @@ -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;
}

Expand Down
16 changes: 13 additions & 3 deletions parser/parse_uri.c
Expand Up @@ -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){ \
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down
12 changes: 9 additions & 3 deletions parser/test/test_parser.c
Expand Up @@ -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");
Expand Down

0 comments on commit 229c5da

Please sign in to comment.