[Asterisk-Dev] app_meetme crash
Rob Gagnon
rob at networkip.net
Wed Jun 2 15:41:48 MST 2004
Here's a patch to fix the logical bug:
Is there something open on bugs.digium.com??
(sorry for the small amount of re-format changes, but I had to align the { }
sets to see the logic better)
Rob
Index: app_meetme.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_meetme.c,v
retrieving revision 1.36
diff -u -p -r1.36 app_meetme.c
--- app_meetme.c 2 Jun 2004 16:57:14 -0000 1.36
+++ app_meetme.c 2 Jun 2004 22:57:50 -0000
@@ -918,7 +918,7 @@ zapretry:
outrun:
if (user->user_no) { /* Only cleanup users who really joined! */
- manager_event(EVENT_FLAG_CALL, "MeetmeLeave",
+ manager_event(EVENT_FLAG_CALL, "MeetmeLeave",
"Channel: %s\r\n"
"Uniqueid: %s\r\n"
"Meetme: %s\r\n",
@@ -926,34 +926,34 @@ outrun:
ast_mutex_lock(&conflock);
conf->users--;
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;
+ 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;
}
- 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);
+ if (!cur)
+ ast_log(LOG_WARNING, "Conference not
found\n");
+ if (conf->chan)
+ ast_hangup(conf->chan);
+ else
+ close(conf->fd);
+ free(conf);
} else {
/* Remove the user struct */
- if (user == cur->firstuser) {
- cur->firstuser->nextuser->prevuser = NULL;
- cur->firstuser = cur->firstuser->nextuser;
- } else if (user == cur->lastuser){
- cur->lastuser->prevuser->nextuser = NULL;
- cur->lastuser = cur->lastuser->prevuser;
+ if (user == conf->firstuser) {
+ user->nextuser->prevuser = NULL;
+ conf->firstuser = user->nextuser;
+ } else if (user == conf->lastuser){
+ user->prevuser->nextuser = NULL;
+ conf->lastuser = user->prevuser;
} else {
user->nextuser->prevuser = user->prevuser;
user->prevuser->nextuser = user->nextuser;
----- Original Message -----
From: "Fabian Stelzer" <fabian at gigacodes.de>
To: <asterisk-dev at lists.digium.com>
Sent: Wednesday, June 02, 2004 5:24 PM
Subject: Re: [Asterisk-Dev] app_meetme crash
> Yeah the "if" is normally not needed!
> can you provide more information about the situation of the crash? (how
many
> users where in, who left or anything else (your usage of meetme)).
> perhaps i can reproduce this and then correctly fix it! (i made the patch)
>
> Regards
> Fabe
>
> ----- Original Message -----
> From: "Rob Gagnon" <rob at networkip.net>
> To: <asterisk-dev at lists.digium.com>
> Sent: Thursday, June 03, 2004 12:08 AM
> Subject: Re: [Asterisk-Dev] app_meetme crash
>
>
> > Hmmm....
> >
> > If user->prevuser is NULL, then it SHOULD be the head of the list, in
> which
> > case the "if (user == cur->firstuser)" statement SHOULD have kicked in.
> >
> > So... this leads me to believe there is another bug some place else
> actually
> > causing the problem.
> >
> > I am not that familiar with the inerds of app_meetme, but from what I
know
> > of doubly-linked-lists, the if-statement you added should not be needed
if
> > the list integrity is maintained.
> >
> > Rob
> > ----- Original Message -----
> > From: "Jared Mauch" <jared at puck.nether.net>
> > To: <asterisk-dev at lists.digium.com>
> > Sent: Wednesday, June 02, 2004 4:29 PM
> > Subject: [Asterisk-Dev] app_meetme crash
> >
> >
> > >
> > > See the patch, this will prevent it from coring, but could lead
> > > to other issues.
> > >
> > > - Jared
> > >
> > > #0 0x003d2c1e in conf_run (chan=0x88aa400, conf=0x86ee8d8,
> confflags=536)
> > > at app_meetme.c:942
> > > 942 user->prevuser->nextuser =
> > user->nextuser;
> > > (gdb) print *user
> > > $1 = {user_no = 1, prevuser = 0x0, nextuser = 0x88beba8, userflags =
> 536,
> > > adminflags = 0, chan = 0x88aa400,
> > > usrvalue = "test", '\0' <repeats 45 times>, jointime = 2586960}
> > > (gdb) print *user->prevuser
> > > Cannot access memory at address 0x0
> > > (gdb) print *user->nextuser
> > > $2 = {user_no = 2, prevuser = 0x0, nextuser = 0x8694058, userflags =
> 536,
> > > adminflags = 0, chan = 0x8878370,
> > > usrvalue = "test", '\0' <repeats 45 times>, jointime = 2586960}
> > > (gdb) print user->nextuser->prevuser
> > > $3 = (struct ast_conf_user *) 0x0
> > > (gdb) print user->prevuser
> > > $4 = (struct ast_conf_user *) 0x0
> > > (gdb) print user->nextuser
> > > $5 = (struct ast_conf_user *) 0x88beba8
> > > (gdb) print user->prevuser
> > > $6 = (struct ast_conf_user *) 0x0
> > >
> > > diff -u -r1.35 app_meetme.c
> > > --- app_meetme.c 1 Jun 2004 22:54:18 -0000 1.35
> > > +++ app_meetme.c 2 Jun 2004 21:27:24 -0000
> > > @@ -939,7 +939,9 @@
> > > cur->lastuser =
cur->lastuser->prevuser;
> > > } else {
> > > user->nextuser->prevuser =
> user->prevuser;
> > > - user->prevuser->nextuser =
> user->nextuser;
> > > + if (user->prevuser != NULL) {
> > > + user->prevuser->nextuser =
> > user->nextuser;
> > > + }
> > > }
> > > /* Return the number of seconds the user was
in
> > the conf */
> > > sprintf(meetmesecs, "%i", (int)
> (user->jointime -
> > time(NULL)));
> > >
> > > --
> > > Jared Mauch | pgp key available via finger from jared at puck.nether.net
> > > clue++; | http://puck.nether.net/~jared/ My statements are only
> > mine.
> > > _______________________________________________
> > > Asterisk-Dev mailing list
> > > Asterisk-Dev at lists.digium.com
> > > http://lists.digium.com/mailman/listinfo/asterisk-dev
> > > To UNSUBSCRIBE or update options visit:
> > > http://lists.digium.com/mailman/listinfo/asterisk-dev
> >
> > _______________________________________________
> > Asterisk-Dev mailing list
> > Asterisk-Dev at lists.digium.com
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
> > To UNSUBSCRIBE or update options visit:
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
> >
>
> _______________________________________________
> Asterisk-Dev mailing list
> Asterisk-Dev at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-dev
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-dev
More information about the asterisk-dev
mailing list