mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-22 21:36:28 +00:00
Fix a few potential memory leaks with realtime users and peers. (issue #8999 reported by bsmithurst)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@53357 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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);
|
peer = build_peer(peername, var, ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS) ? 0 : 1);
|
||||||
|
|
||||||
if (!peer)
|
if (!peer) {
|
||||||
|
ast_variables_destroy(var);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
tmp = var;
|
tmp = var;
|
||||||
while(tmp) {
|
while(tmp) {
|
||||||
@@ -2661,11 +2663,12 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
|
|||||||
}
|
}
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
if (!peer)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ast_variables_destroy(var);
|
ast_variables_destroy(var);
|
||||||
|
|
||||||
|
if (!peer)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
|
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
|
||||||
ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
|
ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
|
||||||
if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
|
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));
|
user = build_user(username, var, !ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS));
|
||||||
if (!user)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ast_variables_destroy(var);
|
ast_variables_destroy(var);
|
||||||
|
|
||||||
|
if (!user)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
|
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
|
||||||
ast_set_flag(user, IAX_RTCACHEFRIENDS);
|
ast_set_flag(user, IAX_RTCACHEFRIENDS);
|
||||||
ast_mutex_lock(&userl.lock);
|
ast_mutex_lock(&userl.lock);
|
||||||
@@ -4925,15 +4929,12 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
|
|||||||
key++;
|
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);
|
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
|
} else
|
||||||
ast_copy_string(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret));
|
ast_copy_string(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret));
|
||||||
|
if (ast_test_flag(user, IAX_TEMPONLY))
|
||||||
|
destroy_user(user);
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
ast_set2_flag(iaxs[callno], iax2_getpeertrunk(*sin), IAX_TRUNK);
|
ast_set2_flag(iaxs[callno], iax2_getpeertrunk(*sin), IAX_TRUNK);
|
||||||
|
Reference in New Issue
Block a user