From fd90308dd76d16452805edad713026c4a9f3bcea Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Thu, 3 Dec 2015 11:01:41 +0200 Subject: [PATCH] rtpengine: Check node address when adding to set The node address has to start with 'udp:', 'udp6:' or 'unix:' and to end with a valid port number. Else, the node is ignored and is not added to the set. --- modules/rtpengine/rtpengine.c | 75 ++++++++++++++++++++++++++------ modules/rtpengine/rtpengine.h | 2 +- modules/rtpengine/rtpengine_db.c | 2 +- 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index 4cb090738d3..b6c7b9a30f6 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -679,13 +679,14 @@ struct rtpp_set *get_rtpp_set(int set_id) int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, - unsigned int weight, int disabled, unsigned int ticks) + unsigned int weight, int disabled, unsigned int ticks, int isDB) { /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; struct rtpp_node *pnode; struct rtpp_node *rtpp_node; - int local_weight; + unsigned int local_weight, port; + str s1; p = rtpproxy; plim = p + strlen(p); @@ -701,19 +702,27 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, ++p; if (p <= p1) break; /* may happen??? */ - /* Have weight specified? If yes, scan it */ - p2 = memchr(p1, '=', p - p1); - if (p2 != NULL) { - local_weight = strtoul(p2 + 1, NULL, 10); - } else { - p2 = p; + p2 = p; + + /* if called for database, consider simple, single char *URL */ + /* if called for config, consider weight URL */ + if (!isDB) { + /* Have weight specified? If yes, scan it */ + p2 = memchr(p1, '=', p - p1); + if (p2 != NULL) { + local_weight = strtoul(p2 + 1, NULL, 10); + } else { + p2 = p; + } } + pnode = shm_malloc(sizeof(struct rtpp_node)); if (pnode == NULL) { LM_ERR("no shm memory left\n"); return -1; } memset(pnode, 0, sizeof(*pnode)); + pnode->idx = rtpp_no++; if (ticks == MI_MAX_RECHECK_TICKS) { pnode->rn_recheck_ticks = ticks; @@ -725,13 +734,14 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, pnode->rn_disabled = disabled; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { + rtpp_no--; shm_free(pnode); LM_ERR("no shm memory left\n"); return -1; } memmove(pnode->rn_url.s, p1, p2 - p1); - pnode->rn_url.s[p2 - p1] = 0; - pnode->rn_url.len = p2-p1; + pnode->rn_url.s[p2 - p1] = 0; + pnode->rn_url.len = p2-p1; /* Leave only address in rn_address */ pnode->rn_address = pnode->rn_url.s; @@ -744,16 +754,49 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, } else if (strncasecmp(pnode->rn_address, "unix:", 5) == 0) { pnode->rn_umode = 0; pnode->rn_address += 5; + } else { + LM_WARN("Node address must start with 'udp:' or 'udp6:' or 'unix:'. Ignore '%s'.\n", pnode->rn_address); + rtpp_no--; + shm_free(pnode->rn_url.s); + shm_free(pnode); + continue; + } + + /* Check the rn_address is 'hostname:port' */ + /* Check the rn_address port is valid */ + p1 = strchr(pnode->rn_address, ':'); + if (p1 != NULL) { + p1++; + } + + if (p1 != NULL && p1 != '\0') { + s1.s = p1; + s1.len = strlen(p1); + if (str2int(&s1, &port) < 0 || port > 0xFFFF) { + LM_WARN("Node address must end with a valid port number. Ignore '%s'.\n", pnode->rn_address); + rtpp_no--; + shm_free(pnode->rn_url.s); + shm_free(pnode); + continue; + } } - // if node found in set, update it + /* If node found in set, update it */ rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url); if (rtpp_node) { rtpp_node->rn_disabled = pnode->rn_disabled; rtpp_node->rn_recheck_ticks = pnode->rn_recheck_ticks; rtpp_node->rn_weight = pnode->rn_weight; + + rtpp_no--; + shm_free(pnode->rn_url.s); shm_free(pnode); - continue; + + if (!isDB) { + continue; + } else { + return 0; + } } if (rtpp_list->rn_first == NULL) { @@ -764,6 +807,12 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, rtpp_list->rn_last = pnode; rtpp_list->rtpp_node_count++; + + if (!isDB) { + continue; + } else { + return 0; + } } return 0; } @@ -826,7 +875,7 @@ static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks) != 0) + if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks, 0) != 0) goto error; else return 0; diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 7c9b952bb26..f29c9cc1969 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -63,7 +63,7 @@ struct rtpp_set_head{ struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url); struct rtpp_set *get_rtpp_set(int set_id); -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks); +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks, int isDB); int init_rtpproxy_db(void); diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index 280044d431a..e91b3cbce6a 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -122,7 +122,7 @@ static int rtpp_load_db(void) continue; } - if (add_rtpengine_socks(rtpp_list, url.s, weight, disabled, ticks) != 0) + if (add_rtpengine_socks(rtpp_list, url.s, weight, disabled, ticks, 1) != 0) { LM_ERR("error inserting '%.*s' into set %d disabled=%d\n", url.len, url.s, setid, disabled);