aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-07 22:36:40 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-07 22:36:40 +0000
commitf4db6c2fe677d5ceb28e207485f9e6f4dcd1154a (patch)
tree5c75029839fcdc08a66a4280575a181674c0b614 /apps
parent09ab7d67e46379ba55856910f944bd9644efd342 (diff)
ensure that conference created by new caller who fails to enter a PIN is destroyed (bug #4613)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6048 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_meetme.c84
1 files changed, 52 insertions, 32 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index ab33c0590..0b1ef370b 100755
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -568,9 +568,50 @@ static void conf_flush(int fd)
ast_log(LOG_WARNING, "Error flushing channel\n");
}
+/* Remove the conference from the list and free it.
+ We assume that this was called while holding conflock. */
+static int conf_free(struct ast_conference *conf)
+{
+ struct ast_conference *prev = NULL, *cur = confs;
+
+ while(cur) {
+ if (cur == conf) {
+ if (prev)
+ prev->next = conf->next;
+ else
+ confs = conf->next;
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+
+ if (!cur)
+ ast_log(LOG_WARNING, "Conference not found\n");
+
+ if (conf->recording == MEETME_RECORD_ACTIVE) {
+ conf->recording = MEETME_RECORD_TERMINATE;
+ ast_mutex_unlock(&conflock);
+ while (1) {
+ ast_mutex_lock(&conflock);
+ if (conf->recording == MEETME_RECORD_OFF)
+ break;
+ ast_mutex_unlock(&conflock);
+ }
+ }
+
+ if (conf->chan)
+ ast_hangup(conf->chan);
+ else
+ close(conf->fd);
+
+ free(conf);
+
+ return 0;
+}
+
static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int confflags)
{
- struct ast_conference *prev=NULL, *cur;
struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user));
struct ast_conf_user *usr = NULL;
int fd;
@@ -1278,41 +1319,12 @@ outrun:
"Meetme: %s\r\n"
"Usernum: %d\r\n",
chan->name, chan->uniqueid, conf->confno, user->user_no);
- prev = NULL;
conf->users--;
if (confflags & CONFFLAG_MARKEDUSER)
conf->markedusers--;
- cur = confs;
if (!conf->users) {
/* No more users -- close this one out */
- while(cur) {
- if (cur == conf) {
- if (prev)
- prev->next = conf->next;
- else
- confs = conf->next;
- break;
- }
- prev = cur;
- cur = cur->next;
- }
- if (!cur)
- ast_log(LOG_WARNING, "Conference not found\n");
- if (conf->recording == MEETME_RECORD_ACTIVE) {
- conf->recording = MEETME_RECORD_TERMINATE;
- ast_mutex_unlock(&conflock);
- while (1) {
- ast_mutex_lock(&conflock);
- if (conf->recording == MEETME_RECORD_OFF)
- break;
- ast_mutex_unlock(&conflock);
- }
- }
- if (conf->chan)
- ast_hangup(conf->chan);
- else
- close(conf->fd);
- free(conf);
+ conf_free(conf);
} else {
/* Remove the user struct */
if (user == conf->firstuser) {
@@ -1678,8 +1690,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
confno[0] = '\0';
}
} else {
+ /* failed when getting the pin */
res = -1;
allowretry = 0;
+ /* see if we need to get rid of the conference */
+ ast_mutex_lock(&conflock);
+ if (!cnf->users) {
+ conf_free(cnf);
+ }
+ ast_mutex_unlock(&conflock);
break;
}
@@ -1698,8 +1717,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
}
}
} while (allowretry);
- /* Do the conference */
+
LOCAL_USER_REMOVE(u);
+
return res;
}