From 6fe1a87e3e1a37e1d4a3a57174571ff8dcc021a9 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Fri, 9 Aug 2019 13:39:44 +0400 Subject: [PATCH] FS-11987: [sofia-sip] Extract URI from info param of SIP Identity Header - allow for a spaces between "info=" and opening '<' - extract URI from inside "<>" but allow empty - let the higher level app decide what to do about it - replace strndup (does not exist on Windows) with memcpy --- libs/sofia-sip/.update | 2 +- .../sofia-sip/libsofia-sip-ua/sip/sip_basic.c | 28 ++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 9c8dbe8654..cd3d3611fc 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Thu Aug 8 15:09:57 CDT 2019 +Tue Aug 13 10:50:57 CDT 2019 diff --git a/libs/sofia-sip/libsofia-sip-ua/sip/sip_basic.c b/libs/sofia-sip/libsofia-sip-ua/sip/sip_basic.c index 85f4aa2328..0dc57fd680 100644 --- a/libs/sofia-sip/libsofia-sip-ua/sip/sip_basic.c +++ b/libs/sofia-sip/libsofia-sip-ua/sip/sip_basic.c @@ -2849,7 +2849,8 @@ SIP_HEADER_CLASS(identity, "Identity", "", id_common, single, identity); issize_t sip_identity_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) { sip_identity_t *id = (sip_identity_t *)h; - char const *p = NULL, *pp = NULL, *ppp = NULL, *ib = NULL, *ie = NULL; + char const *p = NULL, *pp = NULL, *ppp = NULL, *ie = NULL; + char *result = NULL; size_t len = 0; id->id_value = strdup(s); @@ -2857,27 +2858,22 @@ issize_t sip_identity_d(su_home_t *home, sip_header_t *h, char *s, isize_t slen) p = strstr(s, "info="); if (p) { - ib = p + 5; + ie = strchr(p, ';'); pp = strchr(p, '<'); + ppp = strchr(p, '>'); - if (!ie) return 0; + // allow for a spaces between "info=" and opening '<' + // extract URI from inside "<>" but allow empty - let the higher level app decide what to do about it + if (ie && pp && ppp && (pp < ppp) && (ppp < ie)) { - if (pp && pp < ie) { - - // info= with opening '<' - // must contain closing '>' before ';' - ppp = strchr(pp, '>'); - if (!ppp || ppp > ie) { - return 0; - } else { - ib = pp + 1; - ie = ppp - 1; + len = ppp - pp; + if ((result = malloc(len))) { + memcpy(result, pp + 1, len - 1); + result[len - 1] = '\0'; + id->id_info = result; } } - - len = ie - ib + 1; - id->id_info = strndup(ib, len); } return 0;