On Fri, 22 Jan 1999, Richard Glover wrote: >I just want to see how many people get the same error that I do. Use the >stock CircleMUD30bpl15 compile and run it then load up some objects and a >bag. Then, with the objects in your inventory (duh :P), type: > >put x in bag > >and > >get x from bag > >Replace x with whatever objects you loaded and make sure to use the 'in' and >'from'. It always crashes on my machine(s) because of the half_chop(). >George doesn't have the same problem and is using the same code. I'm >wondering if it is machine specific (or user specific :P), so please report >your findings and the machine/os you are on. I finally reproduced it. I couldn't before because it depends on how your stack lines up and I was probably doing it on a Solaris machine at the time. Anyway, it's caused by generic_find() indirectly: -- 8< --- one_argument(arg, name); if (!*name) return (0); *tar_ch = NULL; *tar_obj = NULL; -- 8< --- However, one_argument("in") == "", so we never had the NULL'ing called. That left the pointers in do_get and do_put in a random state. That's why I could get "in is not a container" and you'd crash. So I fixed the underlying generic_find() bug and also modified the do_get/do_put to use one/two_arguments. Index: act.item.c RCS file: /home/jelson/.cvs/circle/src/act.item.c,v retrieving revision 1.21 diff -u -p -r1.21 act.item.c --- act.item.c 1998/12/15 06:45:20 1.21 +++ act.item.c 1999/01/25 17:40:54 @@ -108,9 +108,8 @@ ACMD(do_put) int obj_dotmode, cont_dotmode, found = 0, howmany = 1; char *theobj, *thecont; - half_chop(argument, arg1, argument); - half_chop(argument, arg2, argument); - half_chop(argument, arg3, argument); + argument = two_arguments(argument, arg1, arg2); + one_argument(argument, arg3); if (*arg3 && is_number(arg1)) { howmany = atoi(arg1); @@ -349,9 +348,8 @@ ACMD(do_get) struct obj_data *cont; struct char_data *tmp_char; - half_chop(argument, arg1, argument); - half_chop(argument, arg2, argument); - half_chop(argument, arg3, argument); + argument = two_arguments(argument, arg1, arg2); + one_argument(argument, arg1); if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch)) send_to_char("Your arms are already full!\r\n", ch); Index: handler.c RCS file: /home/jelson/.cvs/circle/src/handler.c,v retrieving revision 1.15 diff -u -p -r1.15 handler.c --- handler.c 1998/12/15 06:56:53 1.15 +++ handler.c 1999/01/25 17:39:10 @@ -1187,13 +1187,13 @@ int generic_find(char *arg, bitvector_t int i, found; char name[256]; + *tar_ch = NULL; + *tar_obj = NULL; + one_argument(arg, name); if (!*name) return (0); - - *tar_ch = NULL; - *tar_obj = NULL; if (IS_SET(bitvector, FIND_CHAR_ROOM)) { /* Find person in room */ if ((*tar_ch = get_char_room_vis(ch, name)) != NULL) Committing shortly. -- George Greer greerga@circlemud.org http://mouse.van.ml.org/ +------------------------------------------------------------+ | 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