Hello,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This should be merged in 1.6.0 and 1.6.1 or just blocked in that branches?<br><br>Thanks in advanced.<br><br><div class="gmail_quote">On Wed, Dec 3, 2008 at 5:25 PM, SVN commits to the Asterisk project <span dir="ltr">&lt;<a href="mailto:asterisk-commits@lists.digium.com">asterisk-commits@lists.digium.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Author: eliel<br>
Date: Wed Dec &nbsp;3 13:25:30 2008<br>
New Revision: 160663<br>
<br>
URL: <a href="http://svn.digium.com/view/asterisk?view=rev&amp;rev=160663" target="_blank">http://svn.digium.com/view/asterisk?view=rev&amp;rev=160663</a><br>
Log:<br>
- iax2-provision was not freeing iax_templates structure when unloading the chan_iax2.so module.<br>
- Move the code to start using the LIST macros.<br>
<br>
Review: <a href="http://reviewboard.digium.com/r/72" target="_blank">http://reviewboard.digium.com/r/72</a><br>
<br>
(closes issue #13232)<br>
Reported by: eliel<br>
Patches:<br>
 &nbsp; &nbsp; &nbsp;iax2-provision.patch.txt uploaded by eliel (license 64)<br>
 &nbsp; &nbsp; &nbsp;(with minor changes pointed by Mark Michelson on review board)<br>
Tested by: eliel<br>
<br>
<br>
Modified:<br>
 &nbsp; &nbsp;trunk/channels/iax2-provision.c<br>
<br>
Modified: trunk/channels/iax2-provision.c<br>
URL: <a href="http://svn.digium.com/view/asterisk/trunk/channels/iax2-provision.c?view=diff&amp;rev=160663&amp;r1=160662&amp;r2=160663" target="_blank">http://svn.digium.com/view/asterisk/trunk/channels/iax2-provision.c?view=diff&amp;rev=160663&amp;r1=160662&amp;r2=160663</a><br>

==============================================================================<br>
--- trunk/channels/iax2-provision.c (original)<br>
+++ trunk/channels/iax2-provision.c Wed Dec &nbsp;3 13:25:30 2008<br>
@@ -51,7 +51,6 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int dead;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char name[80];<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char src[80];<br>
- &nbsp; &nbsp; &nbsp; struct iax_template *next;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char user[20];<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char pass[20];<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char lang[10];<br>
@@ -61,8 +60,13 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;unsigned int altserver;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;unsigned int flags;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;unsigned int format;<br>
- &nbsp; &nbsp; &nbsp; unsigned int tos;<br>
-} *templates;<br>
+ &nbsp; &nbsp; &nbsp; unsigned int tos;<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_ENTRY(iax_template) list;<br>
+};<br>
+<br>
+static AST_LIST_HEAD_NOLOCK_STATIC(templates, iax_template);<br>
+<br>
+AST_MUTEX_DEFINE_STATIC(provlock);<br>
<br>
&nbsp;static struct iax_flag {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char *name;<br>
@@ -132,20 +136,40 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return flags;<br>
&nbsp;}<br>
-AST_MUTEX_DEFINE_STATIC(provlock);<br>
+<br>
+static void iax_template_copy(struct iax_template *dst, struct iax_template *src)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; if (!dst || !src) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;dead = src-&gt;dead;<br>
+ &nbsp; &nbsp; &nbsp; ast_copy_string(dst-&gt;name, src-&gt;name, sizeof(dst-&gt;name));<br>
+ &nbsp; &nbsp; &nbsp; ast_copy_string(dst-&gt;src, src-&gt;src, sizeof(dst-&gt;src));<br>
+ &nbsp; &nbsp; &nbsp; ast_copy_string(dst-&gt;user, src-&gt;user, sizeof(dst-&gt;user));<br>
+ &nbsp; &nbsp; &nbsp; ast_copy_string(dst-&gt;pass, src-&gt;pass, sizeof(dst-&gt;pass));<br>
+ &nbsp; &nbsp; &nbsp; ast_copy_string(dst-&gt;lang, src-&gt;lang, sizeof(dst-&gt;lang));<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;port = src-&gt;port;<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;server = src-&gt;server;<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;altserver = src-&gt;altserver;<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;flags = src-&gt;flags;<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;format = src-&gt;format;<br>
+ &nbsp; &nbsp; &nbsp; dst-&gt;tos = src-&gt;tos;<br>
+}<br>
<br>
&nbsp;static struct iax_template *iax_template_find(const char *s, int allowdead)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct iax_template *cur;<br>
- &nbsp; &nbsp; &nbsp; cur = templates;<br>
- &nbsp; &nbsp; &nbsp; while(cur) {<br>
+<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE(&amp;templates, cur, list) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!strcasecmp(s, cur-&gt;name)) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!allowdead &amp;&amp; cur-&gt;dead)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!allowdead &amp;&amp; cur-&gt;dead) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur = NULL;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur = cur-&gt;next;<br>
- &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return cur;<br>
&nbsp;}<br>
<br>
@@ -158,7 +182,7 @@<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (pos == 3) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ast_mutex_lock(&amp;provlock);<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (c = templates; c; c = c-&gt;next) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE(&amp;templates, c, list) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!strncasecmp(word, c-&gt;name, wordlen) &amp;&amp; ++which &gt; state) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret = ast_strdup(c-&gt;name);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br>
@@ -278,16 +302,15 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!src)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_mutex_lock(&amp;provlock);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_mutex_lock(&amp;provlock);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Backup old data */<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memcpy(&amp;tmp, cur, sizeof(tmp));<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iax_template_copy(&amp;tmp, cur);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Restore from src */<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memcpy(cur, src, sizeof(tmp));<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iax_template_copy(cur, src);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Restore important headers */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memcpy(cur-&gt;name, <a href="http://tmp.name" target="_blank">tmp.name</a>, sizeof(cur-&gt;name));<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur-&gt;dead = tmp.dead;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur-&gt;next = tmp.next;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_mutex_unlock(&amp;provlock);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_mutex_unlock(&amp;provlock);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (def)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strncpy(cur-&gt;src, def, sizeof(cur-&gt;src) - 1);<br>
@@ -359,12 +382,8 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/* Find an already existing one if there */<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct iax_template *cur;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int mallocd = 0;<br>
- &nbsp; &nbsp; &nbsp; cur = templates;<br>
- &nbsp; &nbsp; &nbsp; while(cur) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!strcasecmp(cur-&gt;name, s))<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur = cur-&gt;next;<br>
- &nbsp; &nbsp; &nbsp; }<br>
+<br>
+ &nbsp; &nbsp; &nbsp; cur = iax_template_find(s, 1 /* allow dead */);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (!cur) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mallocd = 1;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur = ast_calloc(1, sizeof(*cur));<br>
@@ -382,8 +401,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/* Link if we&#39;re mallocd */<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (mallocd) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ast_mutex_lock(&amp;provlock);<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur-&gt;next = templates;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; templates = cur;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_LIST_INSERT_HEAD(&amp;templates, cur, list);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ast_mutex_unlock(&amp;provlock);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
@@ -432,8 +450,9 @@<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if ((a-&gt;argc != 3) &amp;&amp; (a-&gt;argc != 4))<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return CLI_SHOWUSAGE;<br>
+<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_mutex_lock(&amp;provlock);<br>
- &nbsp; &nbsp; &nbsp; for (cur = templates;cur;cur = cur-&gt;next) {<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE(&amp;templates, cur, list) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((a-&gt;argc == 3) || (!strcasecmp(a-&gt;argv[3], cur-&gt;name))) &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (found)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ast_cli(a-&gt;fd, &quot;\n&quot;);<br>
@@ -475,17 +494,35 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
&nbsp;}<br>
<br>
+static void iax_provision_free_templates(int dead)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; struct iax_template *cur;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; /* Drop dead or not (depending on dead) entries while locked */<br>
+ &nbsp; &nbsp; &nbsp; ast_mutex_lock(&amp;provlock);<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE_SAFE_BEGIN(&amp;templates, cur, list) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((dead &amp;&amp; cur-&gt;dead) || !dead) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_LIST_REMOVE_CURRENT(list);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_free(cur);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE_SAFE_END;<br>
+ &nbsp; &nbsp; &nbsp; ast_mutex_unlock(&amp;provlock);<br>
+}<br>
+<br>
&nbsp;int iax_provision_unload(void)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;provinit = 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_cli_unregister_multiple(cli_iax2_provision, sizeof(cli_iax2_provision) / sizeof(struct ast_cli_entry));<br>
+ &nbsp; &nbsp; &nbsp; iax_provision_free_templates(0 /* Remove all templates. */);<br>
+<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
&nbsp;}<br>
<br>
&nbsp;int iax_provision_reload(int reload)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct ast_config *cfg;<br>
- &nbsp; &nbsp; &nbsp; struct iax_template *cur, *prev, *next;<br>
+ &nbsp; &nbsp; &nbsp; struct iax_template *cur;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;char *cat;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int found = 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };<br>
@@ -495,10 +532,8 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;cfg = ast_config_load2(&quot;iaxprov.conf&quot;, &quot;chan_iax2&quot;, config_flags);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (cfg != NULL &amp;&amp; cfg != CONFIG_STATUS_FILEUNCHANGED &amp;&amp; cfg != CONFIG_STATUS_FILEINVALID) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Mark all as dead. &nbsp;No need for locking */<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur = templates;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(cur) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AST_LIST_TRAVERSE(&amp;templates, cur, list) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur-&gt;dead = 1;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur = cur-&gt;next;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Load as appropriate */<br>
@@ -516,25 +551,10 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;else<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ast_log(LOG_NOTICE, &quot;No IAX provisioning configuration found, IAX provisioning disabled.\n&quot;);<br>
- &nbsp; &nbsp; &nbsp; ast_mutex_lock(&amp;provlock);<br>
- &nbsp; &nbsp; &nbsp; /* Drop dead entries while locked */<br>
- &nbsp; &nbsp; &nbsp; prev = NULL;<br>
- &nbsp; &nbsp; &nbsp; cur = templates;<br>
- &nbsp; &nbsp; &nbsp; while(cur) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; next = cur-&gt;next;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (cur-&gt;dead) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (prev)<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prev-&gt;next = next;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; templates = next;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ast_free(cur);<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prev = cur;<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur = next;<br>
- &nbsp; &nbsp; &nbsp; }<br>
- &nbsp; &nbsp; &nbsp; ast_mutex_unlock(&amp;provlock);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; iax_provision_free_templates(1 /* remove only marked as dead */);<br>
+<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/* Purge cached signature DB entries */<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ast_db_deltree(&quot;iax/provisioning/cache&quot;, NULL);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return 0;<br>
-<br>
-}<br>
+}<br>
<br>
<br>
_______________________________________________<br>
--Bandwidth and Colocation Provided by <a href="http://www.api-digital.com--" target="_blank">http://www.api-digital.com--</a><br>
<br>
asterisk-commits mailing list<br>
To UNSUBSCRIBE or update options visit:<br>
 &nbsp; <a href="http://lists.digium.com/mailman/listinfo/asterisk-commits" target="_blank">http://lists.digium.com/mailman/listinfo/asterisk-commits</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>Eliel Sardaņons<br>