aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 15:38:48 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-02-07 15:38:48 +0000
commit0cfbb41d14d6b2f1aa439288b312c92a1a6c2004 (patch)
treece0e519da25bbd4105bc2c5f26cc55f9d52fcb64 /channels/chan_iax2.c
parent0ef352eb0db10e4a61802e80091d2275b3ac4027 (diff)
Fix a few potential memory leaks with realtime users and peers. (issue #8999 reported by bsmithurst)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@53357 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r--channels/chan_iax2.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index eca422dfb..db1ee8e6a 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2634,8 +2634,10 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
peer = build_peer(peername, var, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
- if (!peer)
+ if (!peer) {
+ ast_variables_destroy(var);
return NULL;
+ }
tmp = var;
while(tmp) {
@@ -2661,11 +2663,12 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
}
tmp = tmp->next;
}
- if (!peer)
- return NULL;
ast_variables_destroy(var);
+ if (!peer)
+ return NULL;
+
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
@@ -2725,11 +2728,12 @@ static struct iax2_user *realtime_user(const char *username)
}
user = build_user(username, var, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
- if (!user)
- return NULL;
ast_variables_destroy(var);
+ if (!user)
+ return NULL;
+
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
ast_set_flag(user, IAX_RTCACHEFRIENDS);
ast_mutex_lock(&userl.lock);
@@ -4925,15 +4929,12 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
key++;
}
}
- if (!family || !key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret))) {
+ if (!family || !key || ast_db_get(family, key, iaxs[callno]->secret, sizeof(iaxs[callno]->secret)))
ast_log(LOG_WARNING, "Unable to retrieve database password for family/key '%s'!\n", user->dbsecret);
- if (ast_test_flag(user, IAX_TEMPONLY)) {
- destroy_user(user);
- user = NULL;
- }
- }
} else
ast_copy_string(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret));
+ if (ast_test_flag(user, IAX_TEMPONLY))
+ destroy_user(user);
res = 0;
}
ast_set2_flag(iaxs[callno], iax2_getpeertrunk(*sin), IAX_TRUNK);