[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