[Asterisk-Dev] app_meetme crash

Rob Gagnon rob at networkip.net
Wed Jun 2 15:33:39 MST 2004


Here's the problem....

Line 928 of v1.36 app_meetme.c:
      cur = confs;
      if (!conf->users) {
          ...
      } else {
         /* Remove the user struct */
         if (user == cur->firstuser) {
          ......

The issue is that the Remove the user struct section thinks that cur-> is
same as conf-> at this point, but it is actually confs (with an s)

The entire else block should change "cur" to "conf" to become:
         /* Remove the user struct */
         if (user == conf->firstuser) {
            conf->firstuser->nextuser->prevuser = NULL;
            conf->firstuser = conf->firstuser->nextuser;
         } else if (user == conf->lastuser){
            conf->lastuser->prevuser->nextuser = NULL;
            conf->lastuser = conf->lastuser->prevuser;
         } else {
            user->nextuser->prevuser = user->prevuser;
            user->prevuser->nextuser = user->nextuser;
         }

So that the user is removed from the current conference, and not from
"confs" which is the head.

----- Original Message ----- 
From: "Rob Gagnon" <rob at networkip.net>
To: <asterisk-dev at lists.digium.com>
Sent: Wednesday, June 02, 2004 5:08 PM
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




More information about the asterisk-dev mailing list