Index: pbx_dundi.c =================================================================== --- pbx_dundi.c (revision 369042) +++ pbx_dundi.c (working copy) @@ -1300,7 +1300,7 @@ trans->autokilltimeout = global_autokilltimeout; } -/*! \note Called with the peers list already locked */ +static void prune_peers(void); static int do_register_expire(const void *data) { struct dundi_peer *peer = (struct dundi_peer *)data; @@ -1308,7 +1308,11 @@ ast_debug(1, "Register expired for '%s'\n", ast_eid_to_str(eid_str, sizeof(eid_str), &peer->eid)); peer->registerexpire = -1; peer->lastms = 0; - memset(&peer->addr, 0, sizeof(peer->addr)); + /* Remove this peer from the database */ + ast_db_del("dundi/dpeers", dundi_eid_to_str_short(eid_str, sizeof(eid_str), &peer->eid)); + /* Remove this peer from the list of peers */ + peer->dead = 1; + prune_peers(); return 0; } @@ -4162,10 +4166,13 @@ static void destroy_peer(struct dundi_peer *peer) { + AST_SCHED_DEL(sched, peer->registerexpire); AST_SCHED_DEL(sched, peer->registerid); if (peer->regtrans) destroy_trans(peer->regtrans, 0); AST_SCHED_DEL(sched, peer->qualifyid); + if (peer->qualtrans) + destroy_trans(peer->qualtrans, 0); destroy_permissions(&peer->permit); destroy_permissions(&peer->include); ast_free(peer); @@ -4819,6 +4826,8 @@ mark_peers(); prune_peers(); + ast_db_deltree("dundi/dpeers", NULL); + return 0; }