[CODE] Bug in do_return

From: Andrey Fidrya (andrey@alex-ua.com)
Date: 06/29/99


While testing my do_dc bugfix, I've bumped into another bug,
this time in do_return().

Watch this log:

Start logging: 29.06.1999 22:54 by Krys
[...]
> switch janitor
Okay.
the janitor>
Krys appears with an ear-splitting bang.
the janitor>
Krys says, 'Zmey here, I've switched into your body'
the janitor> say ok, I'm returning
You say, 'ok, but I'm returning'
the janitor> return
You return to your original body.

> who
> help
> say
> dklsfjdklsf
> Help
> quit
>
#zap
#Connection terminated by user.
===

The fix is simple:

ACMD(do_return)
{
  if (ch->desc && ch->desc->original) {
    send_to_char("You return to your original body.\r\n", ch);

    /* JE 2/22/95 */
    /* if someone switched into your original body, disconnect them */
-   if (ch->desc->original->desc)
+   if (ch->desc->original->desc) {
+   /*
+    * Zmey: here we put someone switched in our body to disconnect state
+    * but we must also NULL his pointer to our character, otherwise
+    * close_socket() will damage our character's pointer to our descriptor
+    * (which is assigned below in this function).
+    */
+     ch->desc->original->desc->character = NULL;
      STATE(ch->desc->original->desc) = CON_DISCONNECT;
+   }

+   /* Now our descriptor points to our original body */
    ch->desc->character = ch->desc->original;
    ch->desc->original = NULL;

+   /* And our body's pointer to descriptor now points to our descriptor */
    ch->desc->character->desc = ch->desc;
    ch->desc = NULL;
  }
}

Zmey // 3MoonsWorld (rmud.net.ru:4000)


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST