[asterisk-dev] [asterisk-commits] eliel: trunk r160663 - /trunk/channels/iax2-provision.c
Eliel Sardañons
eliel at eliel.net
Wed Dec 3 13:30:29 CST 2008
Hello,
This should be merged in 1.6.0 and 1.6.1 or just blocked in that
branches?
Thanks in advanced.
On Wed, Dec 3, 2008 at 5:25 PM, SVN commits to the Asterisk project <
asterisk-commits at lists.digium.com> wrote:
> Author: eliel
> Date: Wed Dec 3 13:25:30 2008
> New Revision: 160663
>
> URL: http://svn.digium.com/view/asterisk?view=rev&rev=160663
> Log:
> - iax2-provision was not freeing iax_templates structure when unloading the
> chan_iax2.so module.
> - Move the code to start using the LIST macros.
>
> Review: http://reviewboard.digium.com/r/72
>
> (closes issue #13232)
> Reported by: eliel
> Patches:
> iax2-provision.patch.txt uploaded by eliel (license 64)
> (with minor changes pointed by Mark Michelson on review board)
> Tested by: eliel
>
>
> Modified:
> trunk/channels/iax2-provision.c
>
> Modified: trunk/channels/iax2-provision.c
> URL:
> http://svn.digium.com/view/asterisk/trunk/channels/iax2-provision.c?view=diff&rev=160663&r1=160662&r2=160663
>
> ==============================================================================
> --- trunk/channels/iax2-provision.c (original)
> +++ trunk/channels/iax2-provision.c Wed Dec 3 13:25:30 2008
> @@ -51,7 +51,6 @@
> int dead;
> char name[80];
> char src[80];
> - struct iax_template *next;
> char user[20];
> char pass[20];
> char lang[10];
> @@ -61,8 +60,13 @@
> unsigned int altserver;
> unsigned int flags;
> unsigned int format;
> - unsigned int tos;
> -} *templates;
> + unsigned int tos;
> + AST_LIST_ENTRY(iax_template) list;
> +};
> +
> +static AST_LIST_HEAD_NOLOCK_STATIC(templates, iax_template);
> +
> +AST_MUTEX_DEFINE_STATIC(provlock);
>
> static struct iax_flag {
> char *name;
> @@ -132,20 +136,40 @@
> }
> return flags;
> }
> -AST_MUTEX_DEFINE_STATIC(provlock);
> +
> +static void iax_template_copy(struct iax_template *dst, struct
> iax_template *src)
> +{
> + if (!dst || !src) {
> + return;
> + }
> +
> + dst->dead = src->dead;
> + ast_copy_string(dst->name, src->name, sizeof(dst->name));
> + ast_copy_string(dst->src, src->src, sizeof(dst->src));
> + ast_copy_string(dst->user, src->user, sizeof(dst->user));
> + ast_copy_string(dst->pass, src->pass, sizeof(dst->pass));
> + ast_copy_string(dst->lang, src->lang, sizeof(dst->lang));
> + dst->port = src->port;
> + dst->server = src->server;
> + dst->altserver = src->altserver;
> + dst->flags = src->flags;
> + dst->format = src->format;
> + dst->tos = src->tos;
> +}
>
> static struct iax_template *iax_template_find(const char *s, int
> allowdead)
> {
> struct iax_template *cur;
> - cur = templates;
> - while(cur) {
> +
> + AST_LIST_TRAVERSE(&templates, cur, list) {
> if (!strcasecmp(s, cur->name)) {
> - if (!allowdead && cur->dead)
> + if (!allowdead && cur->dead) {
> cur = NULL;
> + }
> break;
> }
> - cur = cur->next;
> - }
> + }
> +
> return cur;
> }
>
> @@ -158,7 +182,7 @@
>
> if (pos == 3) {
> ast_mutex_lock(&provlock);
> - for (c = templates; c; c = c->next) {
> + AST_LIST_TRAVERSE(&templates, c, list) {
> if (!strncasecmp(word, c->name, wordlen) && ++which
> > state) {
> ret = ast_strdup(c->name);
> break;
> @@ -278,16 +302,15 @@
> }
> if (!src)
> return -1;
> - ast_mutex_lock(&provlock);
> + ast_mutex_lock(&provlock);
> /* Backup old data */
> - memcpy(&tmp, cur, sizeof(tmp));
> + iax_template_copy(&tmp, cur);
> /* Restore from src */
> - memcpy(cur, src, sizeof(tmp));
> + iax_template_copy(cur, src);
> /* Restore important headers */
> memcpy(cur->name, tmp.name, sizeof(cur->name));
> cur->dead = tmp.dead;
> - cur->next = tmp.next;
> - ast_mutex_unlock(&provlock);
> + ast_mutex_unlock(&provlock);
> }
> if (def)
> strncpy(cur->src, def, sizeof(cur->src) - 1);
> @@ -359,12 +382,8 @@
> /* Find an already existing one if there */
> struct iax_template *cur;
> int mallocd = 0;
> - cur = templates;
> - while(cur) {
> - if (!strcasecmp(cur->name, s))
> - break;
> - cur = cur->next;
> - }
> +
> + cur = iax_template_find(s, 1 /* allow dead */);
> if (!cur) {
> mallocd = 1;
> cur = ast_calloc(1, sizeof(*cur));
> @@ -382,8 +401,7 @@
> /* Link if we're mallocd */
> if (mallocd) {
> ast_mutex_lock(&provlock);
> - cur->next = templates;
> - templates = cur;
> + AST_LIST_INSERT_HEAD(&templates, cur, list);
> ast_mutex_unlock(&provlock);
> }
> return 0;
> @@ -432,8 +450,9 @@
>
> if ((a->argc != 3) && (a->argc != 4))
> return CLI_SHOWUSAGE;
> +
> ast_mutex_lock(&provlock);
> - for (cur = templates;cur;cur = cur->next) {
> + AST_LIST_TRAVERSE(&templates, cur, list) {
> if ((a->argc == 3) || (!strcasecmp(a->argv[3], cur->name)))
> {
> if (found)
> ast_cli(a->fd, "\n");
> @@ -475,17 +494,35 @@
> return 0;
> }
>
> +static void iax_provision_free_templates(int dead)
> +{
> + struct iax_template *cur;
> +
> + /* Drop dead or not (depending on dead) entries while locked */
> + ast_mutex_lock(&provlock);
> + AST_LIST_TRAVERSE_SAFE_BEGIN(&templates, cur, list) {
> + if ((dead && cur->dead) || !dead) {
> + AST_LIST_REMOVE_CURRENT(list);
> + ast_free(cur);
> + }
> + }
> + AST_LIST_TRAVERSE_SAFE_END;
> + ast_mutex_unlock(&provlock);
> +}
> +
> int iax_provision_unload(void)
> {
> provinit = 0;
> ast_cli_unregister_multiple(cli_iax2_provision,
> sizeof(cli_iax2_provision) / sizeof(struct ast_cli_entry));
> + iax_provision_free_templates(0 /* Remove all templates. */);
> +
> return 0;
> }
>
> int iax_provision_reload(int reload)
> {
> struct ast_config *cfg;
> - struct iax_template *cur, *prev, *next;
> + struct iax_template *cur;
> char *cat;
> int found = 0;
> struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED
> : 0 };
> @@ -495,10 +532,8 @@
> cfg = ast_config_load2("iaxprov.conf", "chan_iax2", config_flags);
> if (cfg != NULL && cfg != CONFIG_STATUS_FILEUNCHANGED && cfg !=
> CONFIG_STATUS_FILEINVALID) {
> /* Mark all as dead. No need for locking */
> - cur = templates;
> - while(cur) {
> + AST_LIST_TRAVERSE(&templates, cur, list) {
> cur->dead = 1;
> - cur = cur->next;
> }
>
> /* Load as appropriate */
> @@ -516,25 +551,10 @@
> return 0;
> else
> ast_log(LOG_NOTICE, "No IAX provisioning configuration
> found, IAX provisioning disabled.\n");
> - ast_mutex_lock(&provlock);
> - /* Drop dead entries while locked */
> - prev = NULL;
> - cur = templates;
> - while(cur) {
> - next = cur->next;
> - if (cur->dead) {
> - if (prev)
> - prev->next = next;
> - else
> - templates = next;
> - ast_free(cur);
> - } else
> - prev = cur;
> - cur = next;
> - }
> - ast_mutex_unlock(&provlock);
> +
> + iax_provision_free_templates(1 /* remove only marked as dead */);
> +
> /* Purge cached signature DB entries */
> ast_db_deltree("iax/provisioning/cache", NULL);
> return 0;
> -
> -}
> +}
>
>
> _______________________________________________
> --Bandwidth and Colocation Provided by http://www.api-digital.com--
>
> asterisk-commits mailing list
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-commits
>
--
Eliel Sardañons
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digium.com/pipermail/asterisk-dev/attachments/20081203/0a30c96b/attachment-0001.htm
More information about the asterisk-dev
mailing list