summaryrefslogtreecommitdiff
path: root/res/res_rtp_asterisk.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_rtp_asterisk.c')
-rw-r--r--res/res_rtp_asterisk.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 958d5831c..25fd3d523 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -4320,8 +4320,22 @@ static int rtp_reload(int reload)
dtmftimeout = DEFAULT_DTMF_TIMEOUT;
strictrtp = DEFAULT_STRICT_RTP;
learning_min_sequential = DEFAULT_LEARNING_MIN_SEQUENTIAL;
+
+ /** This resource is not "reloaded" so much as unloaded and loaded again.
+ * In the case of the TURN related variables, the memory referenced by a
+ * previously loaded instance *should* have been released when the
+ * corresponding pool was destroyed. If at some point in the future this
+ * resource were to support ACTUAL live reconfiguration and did NOT release
+ * the pool this will cause a small memory leak.
+ */
+
icesupport = DEFAULT_ICESUPPORT;
turnport = DEFAULT_TURN_PORT;
+ memset(&stunaddr, 0, sizeof(stunaddr));
+ turnaddr = pj_str(NULL);
+ turnusername = pj_str(NULL);
+ turnpassword = pj_str(NULL);
+
if (cfg) {
if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
rtpstart = atoi(s);
@@ -4381,11 +4395,15 @@ static int rtp_reload(int reload)
}
}
if ((s = ast_variable_retrieve(cfg, "general", "turnaddr"))) {
- pj_strdup2(pool, &turnaddr, s);
- }
- if ((s = ast_variable_retrieve(cfg, "general", "turnport"))) {
- if (!(turnport = atoi(s))) {
- turnport = DEFAULT_TURN_PORT;
+ struct sockaddr_in addr;
+ addr.sin_port = htons(DEFAULT_TURN_PORT);
+ if (ast_parse_arg(s, PARSE_INADDR, &addr)) {
+ ast_log(LOG_WARNING, "Invalid TURN server address: %s\n", s);
+ } else {
+ pj_strdup2(pool, &turnaddr, ast_inet_ntoa(addr.sin_addr));
+ /* ntohs() is not a bug here. The port number is used in host byte order with
+ * a pjnat API. */
+ turnport = ntohs(addr.sin_port);
}
}
if ((s = ast_variable_retrieve(cfg, "general", "turnusername"))) {