Merged revisions 312022 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Thu, 31 Mar 2011 20:12:34 +0000 (20:12 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 31 Mar 2011 20:12:34 +0000 (20:12 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r312022 | rmudgett | 2011-03-31 15:11:40 -0500 (Thu, 31 Mar 2011) | 14 lines

  chan_misdn segfaults when DEBUG_THREADS is enabled.

  The segfault happens because jb->mutexjb is uninitialized from the
  ast_malloc().  The internals of ast_mutex_init() were assuming a nonzero
  value meant mutex tracking initialization had already happened.  Recent
  changes to mutex tracking code to reduce excessive memory consumption
  exposed this uninitialized value.

  Converted misdn_jb_init() to use ast_calloc() instead of ast_malloc().
  Also eliminated redundant zero initialization code in the routine.

  (closes issue #18975)
  Reported by: irroot
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@312023 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_misdn.c

index 91ee823..1942297 100644 (file)
@@ -12453,29 +12453,28 @@ int chan_misdn_jb_empty(struct misdn_bchannel *bc, char *buf, int len)
 /* allocates the jb-structure and initialize the elements*/
 struct misdn_jb *misdn_jb_init(int size, int upper_threshold)
 {
-       int i;
        struct misdn_jb *jb;
 
-       jb = ast_malloc(sizeof(*jb));
+       jb = ast_calloc(1, sizeof(*jb));
        if (!jb) {
            chan_misdn_log(-1, 0, "No free Mem for jb\n");
            return NULL;
        }
        jb->size = size;
        jb->upper_threshold = upper_threshold;
-       jb->wp = 0;
-       jb->rp = 0;
-       jb->state_full = 0;
-       jb->state_empty = 0;
-       jb->bytes_wrote = 0;
-       jb->samples = ast_malloc(size * sizeof(char));
+       //jb->wp = 0;
+       //jb->rp = 0;
+       //jb->state_full = 0;
+       //jb->state_empty = 0;
+       //jb->bytes_wrote = 0;
+       jb->samples = ast_calloc(size, sizeof(*jb->samples));
        if (!jb->samples) {
                ast_free(jb);
                chan_misdn_log(-1, 0, "No free Mem for jb->samples\n");
                return NULL;
        }
 
-       jb->ok = ast_malloc(size * sizeof(char));
+       jb->ok = ast_calloc(size, sizeof(*jb->ok));
        if (!jb->ok) {
                ast_free(jb->samples);
                ast_free(jb);
@@ -12483,10 +12482,6 @@ struct misdn_jb *misdn_jb_init(int size, int upper_threshold)
                return NULL;
        }
 
-       for (i = 0; i < size; i++) {
-               jb->ok[i] = 0;
-       }
-
        ast_mutex_init(&jb->mutexjb);
 
        return jb;