summaryrefslogtreecommitdiff
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2012-11-01 15:03:04 +0000
committerJonathan Rose <jrose@digium.com>2012-11-01 15:03:04 +0000
commitd4a357b82ffd55395813e88ff9d00e572ded389b (patch)
treed69124814ad421d06ff2d8f556ca5bf1fc260883 /channels/chan_sip.c
parent6de0b18b3b460ffe2d893c864c581b94a837d2e4 (diff)
chan_sip: Fix a bug causing SIP reloads to remove all entries from the registry
A regression was introduced in chan_sip by changes to sip reload introduced by r349097. That patch moved peer purging from the beginning of the reload to after the general configuration was finished. This patch fixes that by undoing the repositioning of the original peer purging code and using a similar function after performing general configuration that purges only autocreated peers that were created when persist mode isn't enabled. (closes issue ASTERISK-20611) Reported by: Alisher Review: https://reviewboard.asterisk.org/r/2171/ ........ Merged revisions 375575 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@375576 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 2febf0975..54e43e505 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -30934,7 +30934,16 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
static int peer_markall_func(void *device, void *arg, int flags)
{
struct sip_peer *peer = device;
- if (!peer->selfdestruct || sip_cfg.autocreatepeer != AUTOPEERS_PERSIST) {
+ if (!peer->selfdestruct) {
+ peer->the_mark = 1;
+ }
+ return 0;
+}
+
+static int peer_markall_autopeers_func(void *device, void *arg, int flags)
+{
+ struct sip_peer *peer = device;
+ if (peer->selfdestruct) {
peer->the_mark = 1;
}
return 0;
@@ -31076,6 +31085,11 @@ static int reload_config(enum channelreloadreason reason)
ast_mutex_unlock(&authl_lock);
cleanup_all_regs();
+
+ /* Then, actually destroy users and registry */
+ ASTOBJ_CONTAINER_DESTROYALL(&regl, sip_registry_destroy);
+ ast_debug(4, "--------------- Done destroying registry list\n");
+ ao2_t_callback(peers, OBJ_NODATA, peer_markall_func, NULL, "callback to mark all peers");
}
/* Reset certificate handling for TLS sessions */
@@ -31802,11 +31816,8 @@ static int reload_config(enum channelreloadreason reason)
max_subexpiry = max_expiry;
}
- if (reason != CHANNEL_MODULE_LOAD) {
- /* Then, actually destroy users and registry */
- ASTOBJ_CONTAINER_DESTROYALL(&regl, sip_registry_destroy);
- ast_debug(4, "--------------- Done destroying registry list\n");
- ao2_t_callback(peers, OBJ_NODATA, peer_markall_func, NULL, "callback to mark all peers");
+ if (reason != CHANNEL_MODULE_LOAD && sip_cfg.autocreatepeer != AUTOPEERS_PERSIST) {
+ ao2_t_callback(peers, OBJ_NODATA, peer_markall_autopeers_func, NULL, "callback to mark autopeers for destruction");
}
if (subscribe_network_change) {