mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-25 14:06:27 +00:00
Fix music on hold leak (bug #4842)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6244 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -140,6 +140,22 @@ AST_MUTEX_DEFINE_STATIC(moh_lock);
|
|||||||
#define MPG_123 "/usr/bin/mpg123"
|
#define MPG_123 "/usr/bin/mpg123"
|
||||||
#define MAX_MP3S 256
|
#define MAX_MP3S 256
|
||||||
|
|
||||||
|
|
||||||
|
static void ast_moh_free_class(struct mohclass **class)
|
||||||
|
{
|
||||||
|
struct mohdata *members, *mtmp;
|
||||||
|
|
||||||
|
members = (*class)->members;
|
||||||
|
while(members) {
|
||||||
|
mtmp = members;
|
||||||
|
members = members->next;
|
||||||
|
free(mtmp);
|
||||||
|
}
|
||||||
|
free(*class);
|
||||||
|
*class = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void moh_files_release(struct ast_channel *chan, void *data)
|
static void moh_files_release(struct ast_channel *chan, void *data)
|
||||||
{
|
{
|
||||||
struct moh_files_state *state = chan->music_state;
|
struct moh_files_state *state = chan->music_state;
|
||||||
@@ -776,7 +792,7 @@ static int moh_register(char *classname, char *mode, char *param, char *miscargs
|
|||||||
if (param)
|
if (param)
|
||||||
strncpy(moh->dir, param, sizeof(moh->dir) - 1);
|
strncpy(moh->dir, param, sizeof(moh->dir) - 1);
|
||||||
if (!moh_scan_files(moh)) {
|
if (!moh_scan_files(moh)) {
|
||||||
free(moh);
|
ast_moh_free_class(&moh);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(mode, "mp3") || !strcasecmp(mode, "mp3nb") || !strcasecmp(mode, "quietmp3") || !strcasecmp(mode, "quietmp3nb") || !strcasecmp(mode, "httpmp3") || !strcasecmp(mode, "custom")) {
|
} else if (!strcasecmp(mode, "mp3") || !strcasecmp(mode, "mp3nb") || !strcasecmp(mode, "quietmp3") || !strcasecmp(mode, "quietmp3nb") || !strcasecmp(mode, "httpmp3") || !strcasecmp(mode, "custom")) {
|
||||||
@@ -809,12 +825,12 @@ static int moh_register(char *classname, char *mode, char *param, char *miscargs
|
|||||||
ast_log(LOG_WARNING, "Unable to create moh...\n");
|
ast_log(LOG_WARNING, "Unable to create moh...\n");
|
||||||
if (moh->pseudofd > -1)
|
if (moh->pseudofd > -1)
|
||||||
close(moh->pseudofd);
|
close(moh->pseudofd);
|
||||||
free(moh);
|
ast_moh_free_class(&moh);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ast_log(LOG_WARNING, "Don't know how to do a mode '%s' music on hold\n", mode);
|
ast_log(LOG_WARNING, "Don't know how to do a mode '%s' music on hold\n", mode);
|
||||||
free(moh);
|
ast_moh_free_class(&moh);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ast_mutex_lock(&moh_lock);
|
ast_mutex_lock(&moh_lock);
|
||||||
@@ -915,7 +931,7 @@ static int load_moh_classes(void)
|
|||||||
|
|
||||||
static void ast_moh_destroy(void)
|
static void ast_moh_destroy(void)
|
||||||
{
|
{
|
||||||
struct mohclass *moh,*tmp;
|
struct mohclass *moh, *tmp;
|
||||||
char buff[8192];
|
char buff[8192];
|
||||||
int bytes, tbytes=0, stime = 0, pid = 0;
|
int bytes, tbytes=0, stime = 0, pid = 0;
|
||||||
|
|
||||||
@@ -939,7 +955,7 @@ static void ast_moh_destroy(void)
|
|||||||
}
|
}
|
||||||
tmp = moh;
|
tmp = moh;
|
||||||
moh = moh->next;
|
moh = moh->next;
|
||||||
free(tmp);
|
ast_moh_free_class(&tmp);
|
||||||
}
|
}
|
||||||
mohclasses = NULL;
|
mohclasses = NULL;
|
||||||
ast_mutex_unlock(&moh_lock);
|
ast_mutex_unlock(&moh_lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user