FS-4627 --resolve

This commit is contained in:
Anthony Minessale 2012-09-18 18:42:00 -05:00
parent d80e91d248
commit 016550f218
9 changed files with 252 additions and 166 deletions

View File

@ -1069,7 +1069,10 @@ MSG_HEADER_CLASS(msg_, accept, "Accept", "", ac_params, apndlist,
issize_t msg_accept_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen) issize_t msg_accept_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen)
{ {
msg_accept_t *ac = (msg_accept_t *)h; msg_accept_t *ac;
for(;;) {
ac = (msg_accept_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -1090,7 +1093,9 @@ issize_t msg_accept_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen)
if (*s == ';' && msg_params_d(home, &s, &ac->ac_params) == -1) if (*s == ';' && msg_params_d(home, &s, &ac->ac_params) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t msg_accept_e(char b[], isize_t bsiz, msg_header_t const *h, int flags) issize_t msg_accept_e(char b[], isize_t bsiz, msg_header_t const *h, int flags)
@ -1167,8 +1172,10 @@ issize_t msg_accept_any_d(su_home_t *home,
char *s, isize_t slen) char *s, isize_t slen)
{ {
/** @relatesalso msg_accept_any_s */ /** @relatesalso msg_accept_any_s */
msg_accept_any_t *aa = (msg_accept_any_t *)h; msg_accept_any_t *aa;
for(;;) {
aa = (msg_accept_any_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -1182,7 +1189,9 @@ issize_t msg_accept_any_d(su_home_t *home,
if (*s == ';' && msg_params_d(home, &s, &aa->aa_params) == -1) if (*s == ';' && msg_params_d(home, &s, &aa->aa_params) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
/** Encode an Accept-* header field. */ /** Encode an Accept-* header field. */
@ -2071,9 +2080,11 @@ MSG_HEADER_CLASS_G(content_transfer_encoding, "Content-Transfer-Encoding",
issize_t msg_warning_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen) issize_t msg_warning_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen)
{ {
msg_warning_t *w = (msg_warning_t *)h; msg_warning_t *w;
char *text; char *text;
for(;;) {
w = (msg_warning_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -2093,7 +2104,9 @@ issize_t msg_warning_d(su_home_t *home, msg_header_t *h, char *s, isize_t slen)
w->w_text = text; w->w_text = text;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t msg_warning_e(char b[], isize_t bsiz, msg_header_t const *h, int f) issize_t msg_warning_e(char b[], isize_t bsiz, msg_header_t const *h, int f)

View File

@ -1190,6 +1190,7 @@ msg_header_t *error_header_parse(msg_t *msg, msg_pub_t *mo,
return h; return h;
} }
/** Complete this header field and parse next header field. /** Complete this header field and parse next header field.
* *
* This function completes parsing a multi-field header like @Accept, * This function completes parsing a multi-field header like @Accept,
@ -1238,6 +1239,7 @@ issize_t msg_parse_next_field(su_home_t *home, msg_header_t *prev,
return hc->hc_parse(home, h, s, end - s); return hc->hc_parse(home, h, s, end - s);
} }
/** Decode a message header. */ /** Decode a message header. */
msg_header_t *msg_header_d(su_home_t *home, msg_t const *msg, char const *b) msg_header_t *msg_header_d(su_home_t *home, msg_t const *msg, char const *b)
{ {

View File

@ -185,6 +185,34 @@ SOFIAPUBFUN issize_t msg_unquoted_e(char *b, isize_t bsiz, char const *s);
SOFIAPUBFUN issize_t msg_parse_next_field(su_home_t *home, msg_header_t *prev, SOFIAPUBFUN issize_t msg_parse_next_field(su_home_t *home, msg_header_t *prev,
char *s, isize_t slen); char *s, isize_t slen);
#define msg_parse_next_field_without_recursion() { \
msg_header_t *prev = h; \
msg_hclass_t *hc = prev->sh_class; \
char *end = s + slen; \
\
if (*s && *s != ',') \
return -1; \
\
if (msg_header_update_params(prev->sh_common, 0) < 0) \
return -1; \
\
while (*s == ',') \
*s = '\0', s += span_lws(s + 1) + 1; \
\
if (*s == 0) \
return 0; \
\
h = msg_header_alloc(home, hc, 0); \
if (!h) \
return -1; \
\
prev->sh_succ = h, h->sh_prev = &prev->sh_succ; \
prev->sh_next = h; \
slen = end - s; \
}
/** Terminate encoding. @HI */ /** Terminate encoding. @HI */
#define MSG_TERM_E(p, e) ((p) < (e) ? (p)[0] = '\0' : '\0') #define MSG_TERM_E(p, e) ((p) < (e) ? (p)[0] = '\0' : '\0')

View File

@ -1391,9 +1391,12 @@ issize_t sip_contact_d(su_home_t *home,
char *s, char *s,
isize_t slen) isize_t slen)
{ {
sip_contact_t *m = (sip_contact_t *)h; sip_contact_t *m;
assert(h); assert(h);
for(;;) {
m = (sip_contact_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -1402,7 +1405,9 @@ issize_t sip_contact_d(su_home_t *home,
&m->m_params, &m->m_comment) == -1) &m->m_params, &m->m_comment) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
@ -2106,18 +2111,24 @@ issize_t sip_any_route_d(su_home_t *home,
char *s, char *s,
isize_t slen) isize_t slen)
{ {
sip_route_t *r = (sip_route_t *)h; sip_route_t *r;
assert(h); assert(h);
for (;;) {
r = (sip_route_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') { /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
}
if (sip_name_addr_d(home, &s, &r->r_display, if (sip_name_addr_d(home, &s, &r->r_display, r->r_url, &r->r_params, NULL) < 0) {
r->r_url, &r->r_params, NULL) < 0)
return -1; return -1;
}
msg_parse_next_field_without_recursion();
}
return msg_parse_next_field(home, h, s, slen);
} }
issize_t sip_any_route_e(char b[], isize_t bsiz, sip_header_t const *h, int flags) issize_t sip_any_route_e(char b[], isize_t bsiz, sip_header_t const *h, int flags)
@ -2534,9 +2545,11 @@ SIP_HEADER_CLASS(via, "Via", "v", v_params, prepend, via);
issize_t sip_via_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) issize_t sip_via_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
{ {
sip_via_t *v = (sip_via_t *)h; sip_via_t *v;
assert(h); assert(h);
for (;;) {
v = (sip_via_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -2556,7 +2569,8 @@ issize_t sip_via_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
if (*s == '(' && msg_comment_d(&s, &v->v_comment) == -1) if (*s == '(' && msg_comment_d(&s, &v->v_comment) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t sip_via_e(char b[], isize_t bsiz, sip_header_t const *h, int flags) issize_t sip_via_e(char b[], isize_t bsiz, sip_header_t const *h, int flags)

View File

@ -194,6 +194,7 @@ static
issize_t sip_caller_prefs_d(su_home_t *home, sip_header_t *h, issize_t sip_caller_prefs_d(su_home_t *home, sip_header_t *h,
char *s, isize_t slen) char *s, isize_t slen)
{ {
for(;;) {
sip_caller_prefs_t *cp = (sip_caller_prefs_t *)h; sip_caller_prefs_t *cp = (sip_caller_prefs_t *)h;
url_t url[1]; url_t url[1];
char const *ignore = NULL; char const *ignore = NULL;
@ -225,8 +226,9 @@ issize_t sip_caller_prefs_d(su_home_t *home, sip_header_t *h,
/* Be liberal... */ /* Be liberal... */
/* if (url->url_type != url_any) /* if (url->url_type != url_any)
return -1; */ return -1; */
msg_parse_next_field_without_recursion();
}
return msg_parse_next_field(home, h, s, slen);
} }
static static

View File

@ -40,15 +40,17 @@
#define MSG_PUB_T struct sip_s #define MSG_PUB_T struct sip_s
#define MSG_HDR_T union sip_header_u #define MSG_HDR_T union sip_header_u
#include "sofia-sip/sip_parser.h" #include "sofia-sip/sip_parser.h"
#include "sofia-sip/sip_extra.h" #include "sofia-sip/sip_extra.h"
#include "../su/sofia-sip/su_alloc.h"
#include <stdio.h> #include <stdio.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#
#include <assert.h> #include <assert.h>
/* ====================================================================== */ /* ====================================================================== */
@ -887,7 +889,9 @@ issize_t sip_info_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
sip_call_info_t *ci = h->sh_call_info; sip_call_info_t *ci = h->sh_call_info;
char *end = s + slen; char *end = s + slen;
assert(h); for(;;) {
ci = h->sh_call_info;
end = s + slen;
while (*s == ',') while (*s == ',')
s += span_lws(s + 1) + 1; s += span_lws(s + 1) + 1;
@ -895,8 +899,9 @@ issize_t sip_info_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
if (sip_name_addr_d(home, &s, NULL, ci->ci_url, &ci->ci_params, NULL) < 0) if (sip_name_addr_d(home, &s, NULL, ci->ci_url, &ci->ci_params, NULL) < 0)
return -1; return -1;
/* Recurse */ slen = end - s;
return msg_parse_next_field(home, h, s, end - s); msg_parse_next_field_without_recursion();
}
} }
isize_t sip_info_dup_xtra(sip_header_t const *h, isize_t offset) isize_t sip_info_dup_xtra(sip_header_t const *h, isize_t offset)
@ -1148,7 +1153,10 @@ SIP_HEADER_CLASS(remote_party_id, "Remote-Party-ID", "",
issize_t sip_remote_party_id_d(su_home_t *home, sip_header_t *h, issize_t sip_remote_party_id_d(su_home_t *home, sip_header_t *h,
char *s, isize_t slen) char *s, isize_t slen)
{ {
sip_remote_party_id_t *rpid = (sip_remote_party_id_t *)h; sip_remote_party_id_t *rpid;
for(;;) {
rpid = (sip_remote_party_id_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -1159,7 +1167,9 @@ issize_t sip_remote_party_id_d(su_home_t *home, sip_header_t *h,
&rpid->rpid_params, NULL) == -1) &rpid->rpid_params, NULL) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t sip_remote_party_id_e(char b[], isize_t bsiz, issize_t sip_remote_party_id_e(char b[], isize_t bsiz,
@ -1288,8 +1298,10 @@ SIP_HEADER_CLASS(p_asserted_identity, "P-Asserted-Identity", "",
issize_t sip_p_asserted_identity_d(su_home_t *home, sip_header_t *h, issize_t sip_p_asserted_identity_d(su_home_t *home, sip_header_t *h,
char *s, isize_t slen) char *s, isize_t slen)
{ {
sip_p_asserted_identity_t *paid = (sip_p_asserted_identity_t *)h; sip_p_asserted_identity_t *paid;
for(;;) {
paid = (sip_p_asserted_identity_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -1299,7 +1311,9 @@ issize_t sip_p_asserted_identity_d(su_home_t *home, sip_header_t *h,
NULL, NULL) == -1) NULL, NULL) == -1)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t sip_p_asserted_identity_e(char b[], isize_t bsiz, issize_t sip_p_asserted_identity_e(char b[], isize_t bsiz,

View File

@ -135,10 +135,12 @@ SIP_HEADER_CLASS(accept_disposition, "Accept-Disposition", "",
issize_t sip_accept_disposition_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) issize_t sip_accept_disposition_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
{ {
sip_accept_disposition_t *ad = (sip_accept_disposition_t *)h; sip_accept_disposition_t *ad;
assert(h); assert(h);
for(;;) {
ad = (sip_accept_disposition_t *)h;
/* Ignore empty entries (comma-whitespace) */ /* Ignore empty entries (comma-whitespace) */
while (*s == ',') while (*s == ',')
s += span_lws(s + 1) + 1; s += span_lws(s + 1) + 1;
@ -152,7 +154,9 @@ issize_t sip_accept_disposition_d(su_home_t *home, sip_header_t *h, char *s, isi
if (ad->ad_subtype) ad->ad_subtype++; if (ad->ad_subtype) ad->ad_subtype++;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t sip_accept_disposition_e(char b[], isize_t bsiz, sip_header_t const *h, int flags) issize_t sip_accept_disposition_e(char b[], isize_t bsiz, sip_header_t const *h, int flags)

View File

@ -96,8 +96,10 @@ SIP_HEADER_CLASS(reason, "Reason", "", re_params, append, reason);
issize_t sip_reason_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) issize_t sip_reason_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
{ {
sip_reason_t *re = (sip_reason_t *)h; sip_reason_t *re;
size_t n; size_t n;
for (;;) {
re = (sip_reason_t *)h;
while (*s == ',') /* Ignore empty entries (comma-whitespace) */ while (*s == ',') /* Ignore empty entries (comma-whitespace) */
*s = '\0', s += span_lws(s + 1) + 1; *s = '\0', s += span_lws(s + 1) + 1;
@ -109,7 +111,10 @@ issize_t sip_reason_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
if (*s == ';' && msg_params_d(home, &s, &re->re_params) < 0) if (*s == ';' && msg_params_d(home, &s, &re->re_params) < 0)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
issize_t sip_reason_e(char b[], isize_t bsiz, sip_header_t const *h, int f) issize_t sip_reason_e(char b[], isize_t bsiz, sip_header_t const *h, int f)

View File

@ -458,6 +458,8 @@ typedef struct sip_security_agree_s sip_security_agree_t;
static static
issize_t sip_security_agree_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) issize_t sip_security_agree_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen)
{ {
for (;;) {
sip_security_agree_t *sa = (sip_security_agree_t *)h; sip_security_agree_t *sa = (sip_security_agree_t *)h;
isize_t n; isize_t n;
@ -471,7 +473,9 @@ issize_t sip_security_agree_d(su_home_t *home, sip_header_t *h, char *s, isize_t
if (*s == ';' && msg_params_d(home, &s, &sa->sa_params) < 0) if (*s == ';' && msg_params_d(home, &s, &sa->sa_params) < 0)
return -1; return -1;
return msg_parse_next_field(home, h, s, slen); msg_parse_next_field_without_recursion();
}
} }
static static