From d1ee516f96acb9b65f8fa2b2c41dfc117c1eb228 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Sun, 21 Feb 2021 10:06:45 +0200 Subject: [PATCH] Added ;sn param check to loose.c is_myself() --- src/modules/rr/loose.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/modules/rr/loose.c b/src/modules/rr/loose.c index f1cbe1b629b..76bc0949a6f 100644 --- a/src/modules/rr/loose.c +++ b/src/modules/rr/loose.c @@ -120,7 +120,11 @@ static inline int find_first_route(struct sip_msg* _m) */ static inline int is_myself(sip_uri_t *_puri) { - int ret; + int ret = 0; + param_hooks_t phooks; + param_t* plist = NULL; + param_t *pit = NULL; + str s; if(_puri->host.len==0) { /* catch uri without host (e.g., tel uri) */ @@ -146,6 +150,27 @@ static inline int is_myself(sip_uri_t *_puri) return 0; } + /* Check if URI has ;sn parameter naming existing socket */ + if (ret == 0 && _puri->params.len > 0) { + s = _puri->params; + if (s.s[s.len-1] == ';') + s.len--; + if (parse_params(&s, CLASS_ANY, &phooks, &plist) < 0) { + LM_ERR("bad sip uri parameters: %.*s\n", s.len, s.s); + return 0; + } + for (pit = plist; pit; pit=pit->next) + if (pit->name.len == SOCKNAME_ATTR_LEN + && strncasecmp(pit->name.s, SOCKNAME_ATTR, + SOCKNAME_ATTR_LEN) == 0) { + if (pit->body.len > 0 && + ksr_get_socket_by_name(&pit->body) != NULL) + return 1; + else + break; + } + } + return ret; }