if the first user hangs up while being prompted for a pin, don't hold the

conference open (bug #4656)


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@6088 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.0
Russell Bryant 20 years ago
parent c2a39b5c64
commit 2faf30d730

@ -8,6 +8,9 @@
only, not requiring authentication on incoming invites, or both. Before,
to not require authentication on incoming invites also required matching
peers based on IP only.
-- app_meetme
-- If the first caller into a conference hangs up while being prompted for
the conference pin number, the conference will no longer be held open.
-- app_zapras
-- We now ensure buffer policy is restored after RAS is done with a channel.
This could cause audio problems on the channel after zapras is done

@ -482,9 +482,39 @@ static int confnonzero(void *ptr)
return res;
}
/* 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->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));
int fd;
struct zt_confinfo ztc;
@ -991,31 +1021,12 @@ outrun:
"Meetme: %s\r\n"
"Usernum: %i\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->chan)
ast_hangup(conf->chan);
else
close(conf->fd);
free(conf);
conf_free(conf);
} else {
/* Remove the user struct */
if (user == conf->firstuser) {
@ -1400,8 +1411,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;
}
@ -1420,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
}
}
} while (allowretry);
/* Do the conference */
LOCAL_USER_REMOVE(u);
return res;
}

Loading…
Cancel
Save