diff -uprN -x *.o ../stk/Makefile ./Makefile
--- ../stk/Makefile	Thu Jun 19 00:58:35 1997
+++ ./Makefile	Sun Aug  3 19:29:03 1997
@@ -22,7 +22,7 @@ OBJFILES = comm.o act.comm.o act.informa
 	castle.o class.o config.o constants.o db.o fight.o graph.o handler.o \
 	house.o interpreter.o limits.o magic.o mail.o mobact.o modify.o \
 	objsave.o olc.o shop.o spec_assign.o spec_procs.o spell_parser.o \
-	spells.o utils.o weather.o 
+	spells.o utils.o weather.o buffer.o
 
 default: .accepted
 	$(MAKE) ../bin/circle
@@ -105,104 +105,109 @@ clean:
 # gcc -MM)
 
 act.comm.o: act.comm.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h \
-  handler.h db.h screen.h
+  handler.h db.h screen.h buffer.h
 	$(CC) -c $(CFLAGS) act.comm.c
 act.informative.o: act.informative.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h screen.h
+  interpreter.h handler.h db.h spells.h screen.h buffer.h
 	$(CC) -c $(CFLAGS) act.informative.c
 act.item.o: act.item.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h \
-  handler.h db.h spells.h
+  handler.h db.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) act.item.c
 act.movement.o: act.movement.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h house.h
+  interpreter.h handler.h db.h spells.h house.h buffer.h
 	$(CC) -c $(CFLAGS) act.movement.c
 act.offensive.o: act.offensive.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h
+  interpreter.h handler.h db.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) act.offensive.c
 act.other.o: act.other.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h \
-  handler.h db.h spells.h screen.h house.h
+  handler.h db.h spells.h screen.h house.h buffer.h
 	$(CC) -c $(CFLAGS) act.other.c
 act.social.o: act.social.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h
+  interpreter.h handler.h db.h spells.h buffer.h 
 	$(CC) -c $(CFLAGS) act.social.c
 act.wizard.o: act.wizard.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h house.h screen.h
+  interpreter.h handler.h db.h spells.h house.h screen.h buffer.h
 	$(CC) -c $(CFLAGS) act.wizard.c
-ban.o: ban.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h db.h
+ban.o: ban.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h \
+  db.h buffer.h
 	$(CC) -c $(CFLAGS) ban.c
 boards.o: boards.c conf.h sysdep.h structs.h utils.h comm.h db.h boards.h \
-  interpreter.h handler.h
+  interpreter.h handler.h buffer.h
 	$(CC) -c $(CFLAGS) boards.c
 castle.o: castle.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h \
-  handler.h db.h spells.h
+  handler.h db.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) castle.c
-class.o: class.c conf.h sysdep.h structs.h db.h utils.h spells.h interpreter.h
+class.o: class.c conf.h sysdep.h structs.h db.h utils.h spells.h \
+  interpreter.h buffer.h
 	$(CC) -c $(CFLAGS) class.c
 comm.o: comm.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h \
-  db.h house.h
+  db.h house.h buffer.h
 	$(CC) -c $(CFLAGS) comm.c
-config.o: config.c conf.h sysdep.h structs.h
+config.o: config.c conf.h sysdep.h structs.h buffer.h
 	$(CC) -c $(CFLAGS) config.c
-constants.o: constants.c conf.h sysdep.h structs.h
+constants.o: constants.c conf.h sysdep.h structs.h buffer.h
 	$(CC) -c $(CFLAGS) constants.c
 db.o: db.c conf.h sysdep.h structs.h utils.h db.h comm.h handler.h spells.h mail.h \
-  interpreter.h house.h
+  interpreter.h house.h buffer.h
 	$(CC) -c $(CFLAGS) db.c
 fight.o: fight.c conf.h sysdep.h structs.h utils.h comm.h handler.h interpreter.h \
-  db.h spells.h screen.h
+  db.h spells.h screen.h buffer.h
 	$(CC) -c $(CFLAGS) fight.c
 graph.o: graph.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h \
-  db.h spells.h
+  db.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) graph.c
 handler.o: handler.c conf.h sysdep.h structs.h utils.h comm.h db.h handler.h \
-  interpreter.h spells.h
+  interpreter.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) handler.c
 house.o: house.c conf.h sysdep.h structs.h comm.h handler.h db.h interpreter.h \
-  utils.h house.h
+  utils.h house.h buffer.h
 	$(CC) -c $(CFLAGS) house.c
 interpreter.o: interpreter.c conf.h sysdep.h structs.h comm.h interpreter.h db.h \
-  utils.h spells.h handler.h mail.h screen.h
+  utils.h spells.h handler.h mail.h screen.h buffer.h
 	$(CC) -c $(CFLAGS) interpreter.c
 limits.o: limits.c conf.h sysdep.h structs.h utils.h spells.h comm.h db.h \
-  handler.h
+  handler.h buffer.h
 	$(CC) -c $(CFLAGS) limits.c
-magic.o: magic.c conf.h sysdep.h structs.h utils.h comm.h spells.h handler.h db.h
+magic.o: magic.c conf.h sysdep.h structs.h utils.h comm.h spells.h handler.h \
+  db.h buffer.h
 	$(CC) -c $(CFLAGS) magic.c
 mail.o: mail.c conf.h sysdep.h structs.h utils.h comm.h db.h interpreter.h \
-  handler.h mail.h
+  handler.h mail.h buffer.h
 	$(CC) -c $(CFLAGS) mail.c
 mobact.o: mobact.c conf.h sysdep.h structs.h utils.h db.h comm.h interpreter.h \
-  handler.h spells.h
+  handler.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) mobact.c
 modify.o: modify.c conf.h sysdep.h structs.h utils.h interpreter.h handler.h db.h \
-  comm.h spells.h mail.h boards.h
+  comm.h spells.h mail.h boards.h buffer.h
 	$(CC) -c $(CFLAGS) modify.c
 objsave.o: objsave.c conf.h sysdep.h structs.h comm.h handler.h db.h \
-  interpreter.h utils.h spells.h
+  interpreter.h utils.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) objsave.c
 olc.o: olc.c conf.h sysdep.h structs.h utils.h comm.h interpreter.h handler.h db.h \
-  olc.h
+  olc.h buffer.h
 	$(CC) -c $(CFLAGS) olc.c
 random.o: random.c
 	$(CC) -c $(CFLAGS) random.c
 shop.o: shop.c conf.h sysdep.h structs.h comm.h handler.h db.h interpreter.h \
-  utils.h shop.h
+  utils.h shop.h buffer.h
 	$(CC) -c $(CFLAGS) shop.c
 spec_assign.o: spec_assign.c conf.h sysdep.h structs.h db.h interpreter.h \
-  utils.h
+  utils.h buffer.h
 	$(CC) -c $(CFLAGS) spec_assign.c
 spec_procs.o: spec_procs.c conf.h sysdep.h structs.h utils.h comm.h \
-  interpreter.h handler.h db.h spells.h
+  interpreter.h handler.h db.h spells.h buffer.h
 	$(CC) -c $(CFLAGS) spec_procs.c
 spell_parser.o: spell_parser.c conf.h sysdep.h structs.h utils.h interpreter.h \
-  spells.h handler.h comm.h db.h
+  spells.h handler.h comm.h db.h buffer.h
 	$(CC) -c $(CFLAGS) spell_parser.c
 spells.o: spells.c conf.h sysdep.h structs.h utils.h comm.h spells.h handler.h \
-  db.h
+  db.h buffer.h
 	$(CC) -c $(CFLAGS) spells.c
 utils.o: utils.c conf.h sysdep.h structs.h utils.h comm.h screen.h spells.h \
-  handler.h
+  handler.h buffer.h
 	$(CC) -c $(CFLAGS) utils.c
 weather.o: weather.c conf.h sysdep.h structs.h utils.h comm.h handler.h \
-  interpreter.h db.h
+  interpreter.h db.h buffer.h
 	$(CC) -c $(CFLAGS) weather.c
+buffer.o: buffer.c conf.h sysdep.h structs.h utils.h buffer.h
+	$(CC) -c $(CFLAGS) buffer.c
diff -uprN -x *.o ../stk/Makefile.in ./Makefile.in
--- ../stk/Makefile.in	Thu Jun 19 00:58:35 1997
+++ ./Makefile.in	Fri Aug  1 19:00:50 1997
@@ -21,7 +21,7 @@ OBJFILES = comm.o act.comm.o act.informa
 	castle.o class.o config.o constants.o db.o fight.o graph.o handler.o \
 	house.o interpreter.o limits.o magic.o mail.o mobact.o modify.o \
 	objsave.o olc.o shop.o spec_assign.o spec_procs.o spell_parser.o \
-	spells.o utils.o weather.o @LIBOBJS@
+	spells.o utils.o weather.o buffer.o @LIBOBJS@
 
 default: .accepted
 	$(MAKE) ../bin/circle
@@ -205,3 +205,6 @@ utils.o: utils.c conf.h sysdep.h structs
 weather.o: weather.c conf.h sysdep.h structs.h utils.h comm.h handler.h \
   interpreter.h db.h
 	$(CC) -c $(CFLAGS) weather.c
+buffer.o: buffer.c conf.h sysdep.h structs.h utils.h buffer.h
+	$(CC) -c $(CFLAGS) buffer.c
+
diff -uprN -x *.o ../stk/act.comm.c ./act.comm.c
--- ../stk/act.comm.c	Thu Jun 19 00:58:35 1997
+++ ./act.comm.c	Thu Aug 14 14:47:25 1997
@@ -32,6 +32,8 @@ ACMD(do_say)
   if (!*argument)
     send_to_char("Yes, but WHAT do you want to say?\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_STRING_LENGTH);
+
     sprintf(buf, "$n says, '%s'", argument);
     act(buf, FALSE, ch, 0, 0, TO_ROOM);
     if (PRF_FLAGGED(ch, PRF_NOREPEAT))
@@ -40,6 +42,7 @@ ACMD(do_say)
       sprintf(buf, "You say, '%s'", argument);
       act(buf, FALSE, ch, 0, argument, TO_CHAR);
     }
+    release_buffer(buf);
   }
 }
 
@@ -58,6 +61,8 @@ ACMD(do_gsay)
   if (!*argument)
     send_to_char("Yes, but WHAT do you want to group-say?\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_STRING_LENGTH);
+
     if (ch->master)
       k = ch->master;
     else
@@ -77,12 +82,15 @@ ACMD(do_gsay)
       sprintf(buf, "You tell the group, '%s'", argument);
       act(buf, FALSE, ch, 0, 0, TO_CHAR | TO_SLEEP);
     }
+    release_buffer(buf);
   }
 }
 
 
 void perform_tell(struct char_data *ch, struct char_data *vict, char *arg)
 {
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+
   send_to_char(CCRED(vict, C_NRM), vict);
   sprintf(buf, "$n tells you, '%s'", arg);
   act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP);
@@ -98,6 +106,7 @@ void perform_tell(struct char_data *ch, 
   }
 
   GET_LAST_TELL(vict) = GET_IDNUM(ch);
+  release_buffer(buf);
 }
 
 /*
@@ -106,6 +115,9 @@ void perform_tell(struct char_data *ch, 
  */
 ACMD(do_tell)
 {
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
+
   struct char_data *vict;
 
   half_chop(argument, buf, buf2);
@@ -129,6 +141,9 @@ ACMD(do_tell)
     act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP);
   else
     perform_tell(ch, vict, buf2);
+
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
@@ -165,6 +180,8 @@ ACMD(do_spec_comm)
 {
   struct char_data *vict;
   char *action_sing, *action_plur, *action_others;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
 
   if (subcmd == SCMD_WHISPER) {
     action_sing = "whisper to";
@@ -196,14 +213,22 @@ ACMD(do_spec_comm)
     }
     act(action_others, FALSE, ch, 0, vict, TO_NOTVICT);
   }
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
 
 #define MAX_NOTE_LENGTH 1000	/* arbitrary */
-
+/*
+ * XXX: This uses release_and_return;
+ */
 ACMD(do_write)
 {
+  char *buf1 = get_buffer(MAX_STRING_LENGTH);
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+
   struct obj_data *paper = 0, *pen = 0;
   char *papername, *penname;
 
@@ -212,47 +237,45 @@ ACMD(do_write)
 
   two_arguments(argument, papername, penname);
 
-  if (!ch->desc)
-    return;
-
-  if (!*papername) {		/* nothing was delivered */
+  if (!ch->desc) {
+    release_and_return;
+  } else if (!*papername) {		/* nothing was delivered */
     send_to_char("Write?  With what?  ON what?  What are you trying to do?!?\r\n", ch);
-    return;
-  }
-  if (*penname) {		/* there were two arguments */
+    release_and_return;
+  } else if (*penname) {		/* there were two arguments */
     if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying))) {
       sprintf(buf, "You have no %s.\r\n", papername);
       send_to_char(buf, ch);
-      return;
+      release_and_return;
     }
     if (!(pen = get_obj_in_list_vis(ch, penname, ch->carrying))) {
       sprintf(buf, "You have no %s.\r\n", penname);
       send_to_char(buf, ch);
-      return;
+      release_and_return;
     }
   } else {		/* there was one arg.. let's see what we can find */
     if (!(paper = get_obj_in_list_vis(ch, papername, ch->carrying))) {
       sprintf(buf, "There is no %s in your inventory.\r\n", papername);
       send_to_char(buf, ch);
-      return;
+      release_and_return;
     }
     if (GET_OBJ_TYPE(paper) == ITEM_PEN) {	/* oops, a pen.. */
       pen = paper;
       paper = 0;
     } else if (GET_OBJ_TYPE(paper) != ITEM_NOTE) {
       send_to_char("That thing has nothing to do with writing.\r\n", ch);
-      return;
+      release_and_return;
     }
     /* One object was found.. now for the other one. */
     if (!GET_EQ(ch, WEAR_HOLD)) {
       sprintf(buf, "You can't write with %s %s alone.\r\n", AN(papername),
 	      papername);
       send_to_char(buf, ch);
-      return;
+      release_and_return;
     }
     if (!CAN_SEE_OBJ(ch, GET_EQ(ch, WEAR_HOLD))) {
       send_to_char("The stuff in your hand is invisible!  Yeech!!\r\n", ch);
-      return;
+      release_and_return;
     }
     if (pen)
       paper = GET_EQ(ch, WEAR_HOLD);
@@ -275,12 +298,17 @@ ACMD(do_write)
     ch->desc->str = &paper->action_description;
     ch->desc->max_str = MAX_NOTE_LENGTH;
   }
+  release_buffer(buf1);
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
 
 ACMD(do_page)
 {
+  char *arg = get_buffer(MAX_STRING_LENGTH);
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
   struct descriptor_data *d;
   struct char_data *vict;
 
@@ -291,6 +319,8 @@ ACMD(do_page)
   else if (!*arg)
     send_to_char("Whom do you wish to page?\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_STRING_LENGTH);
+
     sprintf(buf, "\007\007*%s* %s\r\n", GET_NAME(ch), buf2);
     if (!str_cmp(arg, "all")) {
       if (GET_LEVEL(ch) > LVL_GOD) {
@@ -299,6 +329,9 @@ ACMD(do_page)
 	    act(buf, FALSE, ch, 0, d->character, TO_VICT);
       } else
 	send_to_char("You will never be godly enough to do that!\r\n", ch);
+      release_buffer(arg);
+      release_buffer(buf2);
+      release_buffer(buf);
       return;
     }
     if ((vict = get_char_vis(ch, arg)) != NULL) {
@@ -307,10 +340,16 @@ ACMD(do_page)
 	send_to_char(OK, ch);
       else
 	act(buf, FALSE, ch, 0, vict, TO_CHAR);
+      release_buffer(arg);
+      release_buffer(buf2);
+      release_buffer(buf);
       return;
     } else
       send_to_char("There is no such person in the game!\r\n", ch);
+    release_buffer(buf);
   }
+  release_buffer(arg);
+  release_buffer(buf2);
 }
 
 
@@ -323,7 +362,7 @@ ACMD(do_gen_comm)
   extern int level_can_shout;
   extern int holler_move_cost;
   struct descriptor_data *i;
-  char color_on[24];
+  char *color_on, *buf;
 
   /* Array of flags which must _not_ be set in order for comm to be heard */
   static int channels[] = {
@@ -382,9 +421,11 @@ ACMD(do_gen_comm)
   }
   /* level_can_shout defined in config.c */
   if (GET_LEVEL(ch) < level_can_shout) {
+    char *buf1 = get_buffer(128);
     sprintf(buf1, "You must be at least level %d before you can %s.\r\n",
 	    level_can_shout, com_msgs[subcmd][1]);
     send_to_char(buf1, ch);
+    release_buffer(buf1);
     return;
   }
   /* make sure the char is on the channel */
@@ -397,9 +438,11 @@ ACMD(do_gen_comm)
 
   /* make sure that there is something there to say! */
   if (!*argument) {
+    char *buf1 = get_buffer(128);
     sprintf(buf1, "Yes, %s, fine, %s we must, but WHAT???\r\n",
 	    com_msgs[subcmd][1], com_msgs[subcmd][1]);
     send_to_char(buf1, ch);
+    release_buffer(buf1);
     return;
   }
   if (subcmd == SCMD_HOLLER) {
@@ -410,20 +453,24 @@ ACMD(do_gen_comm)
       GET_MOVE(ch) -= holler_move_cost;
   }
   /* set up the color on code */
+  color_on = get_buffer(24);
   strcpy(color_on, com_msgs[subcmd][3]);
 
   /* first, set up strings to be given to the communicator */
   if (PRF_FLAGGED(ch, PRF_NOREPEAT))
     send_to_char(OK, ch);
   else {
+    char *buf1 = get_buffer(MAX_STRING_LENGTH);
     if (COLOR_LEV(ch) >= C_CMP)
       sprintf(buf1, "%sYou %s, '%s'%s", color_on, com_msgs[subcmd][1],
 	      argument, KNRM);
     else
       sprintf(buf1, "You %s, '%s'", com_msgs[subcmd][1], argument);
     act(buf1, FALSE, ch, 0, 0, TO_CHAR | TO_SLEEP);
+    release_buffer(buf1);
   }
 
+  buf = get_buffer(MAX_STRING_LENGTH);
   sprintf(buf, "$n %ss, '%s'", com_msgs[subcmd][1], argument);
 
   /* now send all the strings out */
@@ -445,18 +492,22 @@ ACMD(do_gen_comm)
 	send_to_char(KNRM, i->character);
     }
   }
+  release_buffer(color_on);
+  release_buffer(buf);
 }
 
 
 ACMD(do_qcomm)
 {
   struct descriptor_data *i;
+  char *buf;
 
   if (!PRF_FLAGGED(ch, PRF_QUEST)) {
     send_to_char("You aren't even part of the quest!\r\n", ch);
     return;
   }
   skip_spaces(&argument);
+  buf = get_buffer(128);
 
   if (!*argument) {
     sprintf(buf, "%s?  Yes, fine, %s we must, but WHAT??\r\n", CMD_NAME,
@@ -484,4 +535,5 @@ ACMD(do_qcomm)
 	  PRF_FLAGGED(i->character, PRF_QUEST))
 	act(buf, 0, ch, 0, i->character, TO_VICT | TO_SLEEP);
   }
+  release_buffer(buf);
 }
diff -uprN -x *.o ../stk/act.informative.c ./act.informative.c
--- ../stk/act.informative.c	Thu Jun 19 00:58:35 1997
+++ ./act.informative.c	Tue Aug 12 17:18:45 1997
@@ -52,6 +52,7 @@ void show_obj_to_char(struct obj_data * 
 			int mode)
 {
   bool found;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   *buf = '\0';
   if ((mode == 0) && object->description)
@@ -67,6 +68,7 @@ void show_obj_to_char(struct obj_data * 
 	page_string(ch->desc, buf, 1);
       } else
 	act("It's blank.", FALSE, ch, 0, 0, TO_CHAR);
+      release_buffer(buf);
       return;
     } else if (GET_OBJ_TYPE(object) != ITEM_DRINKCON) {
       strcpy(buf, "You see nothing special..");
@@ -98,6 +100,7 @@ void show_obj_to_char(struct obj_data * 
   }
   strcat(buf, "\r\n");
   page_string(ch->desc, buf, 1);
+  release_buffer(buf);
 }
 
 
@@ -122,6 +125,7 @@ void list_obj_to_char(struct obj_data * 
 void diag_char_to_char(struct char_data * i, struct char_data * ch)
 {
   int percent;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   if (GET_MAX_HIT(i) > 0)
     percent = (100 * GET_HIT(i)) / GET_MAX_HIT(i);
@@ -149,6 +153,7 @@ void diag_char_to_char(struct char_data 
     strcat(buf, " is bleeding awfully from big wounds.\r\n");
 
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -195,6 +200,7 @@ void look_at_char(struct char_data * i, 
 
 void list_one_char(struct char_data * i, struct char_data * ch)
 {
+  char *buf = get_buffer(MAX_STRING_LENGTH);
   char *positions[] = {
     " is lying here, dead.",
     " is lying here, mortally wounded.",
@@ -227,6 +233,7 @@ void list_one_char(struct char_data * i,
     if (IS_AFFECTED(i, AFF_BLIND))
       act("...$e is groping around blindly!", FALSE, i, 0, ch, TO_VICT);
 
+    release_buffer(buf);
     return;
   }
   if (IS_NPC(i)) {
@@ -273,6 +280,8 @@ void list_one_char(struct char_data * i,
 
   if (IS_AFFECTED(i, AFF_SANCTUARY))
     act("...$e glows with a bright light!", FALSE, i, 0, ch, TO_VICT);
+
+  release_buffer(buf);
 }
 
 
@@ -295,7 +304,8 @@ void list_char_to_char(struct char_data 
 void do_auto_exits(struct char_data * ch)
 {
   int door;
-
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
   *buf = '\0';
 
   for (door = 0; door < NUM_OF_DIRS; door++)
@@ -307,19 +317,23 @@ void do_auto_exits(struct char_data * ch
 	  *buf ? buf : "None! ", CCNRM(ch, C_NRM));
 
   send_to_char(buf2, ch);
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
 ACMD(do_exits)
 {
   int door;
-
-  *buf = '\0';
+  char *buf, *buf2;
 
   if (IS_AFFECTED(ch, AFF_BLIND)) {
     send_to_char("You can't see a damned thing, you're blind!\r\n", ch);
     return;
   }
+  buf = get_buffer(MAX_STRING_LENGTH);
+  buf2 = get_buffer(MAX_STRING_LENGTH);
+
   for (door = 0; door < NUM_OF_DIRS; door++)
     if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE &&
 	!IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED)) {
@@ -344,12 +358,16 @@ ACMD(do_exits)
     send_to_char(buf, ch);
   else
     send_to_char(" None.\r\n", ch);
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
 
 void look_at_room(struct char_data * ch, int ignore_brief)
 {
+  char *buf2;
+
   if (IS_DARK(ch->in_room) && !CAN_SEE_IN_DARK(ch)) {
     send_to_char("It is pitch black...\r\n", ch);
     return;
@@ -357,11 +375,15 @@ void look_at_room(struct char_data * ch,
     send_to_char("You see nothing but infinite darkness...\r\n", ch);
     return;
   }
+
+  buf2 = get_buffer(MAX_STRING_LENGTH);
   send_to_char(CCCYN(ch, C_NRM), ch);
   if (PRF_FLAGGED(ch, PRF_ROOMFLAGS)) {
+    char *buf = get_buffer(MAX_STRING_LENGTH);
     sprintbit((long) ROOM_FLAGS(ch->in_room), room_bits, buf);
     sprintf(buf2, "[%5d] %s [ %s]", world[ch->in_room].number,
 	    world[ch->in_room].name, buf);
+    release_buffer(buf);
     send_to_char(buf2, ch);
   } else
     send_to_char(world[ch->in_room].name, ch);
@@ -383,6 +405,8 @@ void look_at_room(struct char_data * ch,
   send_to_char(CCYEL(ch, C_NRM), ch);
   list_char_to_char(world[ch->in_room].people, ch);
   send_to_char(CCNRM(ch, C_NRM), ch);
+
+  release_buffer(buf2);
 }
 
 
@@ -390,6 +414,7 @@ void look_at_room(struct char_data * ch,
 void look_in_direction(struct char_data * ch, int dir)
 {
   if (EXIT(ch, dir)) {
+    char *buf = get_buffer(64);
     if (EXIT(ch, dir)->general_description)
       send_to_char(EXIT(ch, dir)->general_description, ch);
     else
@@ -402,6 +427,7 @@ void look_in_direction(struct char_data 
       sprintf(buf, "The %s is open.\r\n", fname(EXIT(ch, dir)->keyword));
       send_to_char(buf, ch);
     }
+    release_buffer(buf);
   } else
     send_to_char("Nothing special there...\r\n", ch);
 }
@@ -413,6 +439,7 @@ void look_in_obj(struct char_data * ch, 
   struct obj_data *obj = NULL;
   struct char_data *dummy = NULL;
   int amt, bits;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   if (!*arg)
     send_to_char("Look in what?\r\n", ch);
@@ -451,14 +478,17 @@ void look_in_obj(struct char_data * ch, 
 	if (GET_OBJ_VAL(obj,0) <= 0 || GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) {
 	  sprintf(buf, "Its contents seem somewhat murky.\r\n"); /* BUG */
 	} else {
+	  char *buf2 = get_buffer(128);
 	  amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0);
 	  sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2);
 	  sprintf(buf, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2);
+	  release_buffer(buf2);
 	}
 	send_to_char(buf, ch);
       }
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -545,7 +575,6 @@ void look_at_target(struct char_data * c
 
 ACMD(do_look)
 {
-  static char arg2[MAX_INPUT_LENGTH];
   int look_type;
 
   if (!ch->desc)
@@ -559,13 +588,17 @@ ACMD(do_look)
     send_to_char("It is pitch black...\r\n", ch);
     list_char_to_char(world[ch->in_room].people, ch);	/* glowing red eyes */
   } else {
+    char *arg2 = get_buffer(MAX_INPUT_LENGTH),
+	*arg = get_buffer(MAX_STRING_LENGTH);
     half_chop(argument, arg, arg2);
 
     if (subcmd == SCMD_READ) {
+      release_buffer(arg2);
       if (!*arg)
 	send_to_char("Read what?\r\n", ch);
       else
 	look_at_target(ch, arg);
+      release_buffer(arg);
       return;
     }
     if (!*arg)			/* "look" alone, without an argument at all */
@@ -579,6 +612,9 @@ ACMD(do_look)
       look_at_target(ch, arg2);
     else
       look_at_target(ch, arg);
+
+    release_buffer(arg);
+    release_buffer(arg2);
   }
 }
 
@@ -589,11 +625,13 @@ ACMD(do_examine)
   int bits;
   struct char_data *tmp_char;
   struct obj_data *tmp_object;
+  char *arg = get_buffer(MAX_STRING_LENGTH);
 
   one_argument(argument, arg);
 
   if (!*arg) {
     send_to_char("Examine what?\r\n", ch);
+    release_buffer(arg);
     return;
   }
   look_at_target(ch, arg);
@@ -609,6 +647,7 @@ ACMD(do_examine)
       look_in_obj(ch, arg);
     }
   }
+  release_buffer(arg);
 }
 
 
@@ -620,8 +659,10 @@ ACMD(do_gold)
   else if (GET_GOLD(ch) == 1)
     send_to_char("You have one miserable little gold coin.\r\n", ch);
   else {
+    char *buf = get_buffer(64);
     sprintf(buf, "You have %d gold coins.\r\n", GET_GOLD(ch));
     send_to_char(buf, ch);
+    release_buffer(buf);
   }
 }
 
@@ -630,6 +671,7 @@ ACMD(do_score)
 {
   struct time_info_data playing_time;
   struct time_info_data real_time_passed(time_t t2, time_t t1);
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   sprintf(buf, "You are %d years old.", GET_AGE(ch));
 
@@ -736,6 +778,7 @@ ACMD(do_score)
     strcat(buf, "You are summonable by other players.\r\n");
 
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -772,7 +815,7 @@ ACMD(do_equipment)
 
 ACMD(do_time)
 {
-  char *suf;
+  char *suf, *buf = get_buffer(256);
   int weekday, day;
   extern struct time_info_data time_info;
   extern const char *weekdays[];
@@ -812,6 +855,7 @@ ACMD(do_time)
 	  day, suf, month_name[(int) time_info.month], time_info.year);
 
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -824,10 +868,12 @@ ACMD(do_weather)
   "lit by flashes of lightning"};
 
   if (OUTSIDE(ch)) {
+    char *buf = get_buffer(256);
     sprintf(buf, "The sky is %s and %s.\r\n", sky_look[weather_info.sky],
 	    (weather_info.change >= 0 ? "you feel a warm wind from south" :
 	     "your foot tells you bad weather is due"));
     send_to_char(buf, ch);
+    release_buffer(buf);
   } else
     send_to_char("You have no feeling about the weather at all.\r\n", ch);
 }
@@ -890,12 +936,15 @@ ACMD(do_who)
 {
   struct descriptor_data *d;
   struct char_data *tch;
-  char name_search[MAX_INPUT_LENGTH];
-  char mode;
   size_t i;
   int low = 0, high = LVL_IMPL, localwho = 0, questwho = 0;
   int showclass = 0, short_list = 0, outlaws = 0, num_can_see = 0;
   int who_room = 0;
+  char	*buf = get_buffer(MAX_STRING_LENGTH),
+	*arg = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH),
+	*name_search = get_buffer(MAX_INPUT_LENGTH),
+	mode;
 
   skip_spaces(&argument);
   strcpy(buf, argument);
@@ -950,6 +999,10 @@ ACMD(do_who)
 
     } else {			/* endif */
       send_to_char(WHO_FORMAT, ch);
+      release_buffer(name_search);
+      release_buffer(buf);
+      release_buffer(arg);
+      release_buffer(buf1);
       return;
     }
   }				/* end while (parser) */
@@ -1030,6 +1083,11 @@ ACMD(do_who)
   else
     sprintf(buf, "\r\n%d characters displayed.\r\n", num_can_see);
   send_to_char(buf, ch);
+
+  release_buffer(name_search);
+  release_buffer(buf);
+  release_buffer(arg);
+  release_buffer(buf1);
 }
 
 
@@ -1039,14 +1097,28 @@ ACMD(do_who)
 ACMD(do_users)
 {
   extern char *connected_types[];
-  char line[200], line2[220], idletime[10], classname[20];
-  char state[30], *timeptr, *format, mode;
-  char name_search[MAX_INPUT_LENGTH], host_search[MAX_INPUT_LENGTH];
   struct char_data *tch;
   struct descriptor_data *d;
   size_t i;
   int low = 0, high = LVL_IMPL, num_can_see = 0;
   int showclass = 0, outlaws = 0, playing = 0, deadweight = 0;
+#warning BUFFER: Help! I'm drowning in (char *)'s!
+  /*
+   * I think this function needs more (char *)'s, it doesn't have enough.
+   */
+  char	*buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH),
+	*arg = get_buffer(MAX_STRING_LENGTH),
+	*name_search = get_buffer(MAX_INPUT_LENGTH),
+	*host_search = get_buffer(MAX_INPUT_LENGTH),
+	*line2 = get_buffer(220),
+	*line = get_buffer(200),
+	*state = get_buffer(30),
+	*classname = get_buffer(20),
+	*idletime = get_buffer(10),
+	*timeptr,
+	*format,
+	mode;
 
   host_search[0] = name_search[0] = '\0';
 
@@ -1091,13 +1163,13 @@ ACMD(do_users)
 	break;
       default:
 	send_to_char(USERS_FORMAT, ch);
-	return;
+	release_and_return;
 	break;
       }				/* end of switch */
 
     } else {			/* endif */
       send_to_char(USERS_FORMAT, ch);
-      return;
+      release_and_return;
     }
   }				/* end while (parser) */
   strcpy(line,
@@ -1187,6 +1259,7 @@ ACMD(do_users)
 
   sprintf(line, "\r\n%d visible sockets connected.\r\n", num_can_see);
   send_to_char(line, ch);
+  release_and_return;
 }
 
 
@@ -1194,6 +1267,7 @@ ACMD(do_users)
 ACMD(do_gen_ps)
 {
   extern char circlemud_version[];
+  char *buf;
 
   switch (subcmd) {
   case SCMD_CREDITS:
@@ -1230,7 +1304,9 @@ ACMD(do_gen_ps)
     send_to_char(circlemud_version, ch);
     break;
   case SCMD_WHOAMI:
+    buf = get_buffer(MAX_NAME_LENGTH + 3); /* \r\n\0 */
     send_to_char(strcat(strcpy(buf, GET_NAME(ch)), "\r\n"), ch);
+    release_buffer(buf);
     break;
   default:
     return;
@@ -1243,6 +1319,7 @@ void perform_mortal_where(struct char_da
 {
   register struct char_data *i;
   register struct descriptor_data *d;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   if (!*arg) {
     send_to_char("Players in your Zone\r\n--------------------\r\n", ch);
@@ -1261,16 +1338,20 @@ void perform_mortal_where(struct char_da
 	  (i->in_room != NOWHERE) && isname(arg, i->player.name)) {
 	sprintf(buf, "%-25s - %s\r\n", GET_NAME(i), world[i->in_room].name);
 	send_to_char(buf, ch);
+        release_buffer(buf);
 	return;
       }
     send_to_char("No-one around by that name.\r\n", ch);
   }
+  release_buffer(buf);
 }
 
 
 void print_object_location(int num, struct obj_data * obj, struct char_data * ch,
 			        int recur)
 {
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+
   if (num > 0)
     sprintf(buf, "O%3d. %-25s - ", num, obj->short_description);
   else
@@ -1298,6 +1379,7 @@ void print_object_location(int num, stru
     sprintf(buf + strlen(buf), "in an unknown location\n\r");
     send_to_char(buf, ch);
   }
+  release_buffer(buf);
 }
 
 
@@ -1308,6 +1390,7 @@ void perform_immort_where(struct char_da
   register struct obj_data *k;
   struct descriptor_data *d;
   int num = 0, found = 0;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   if (!*arg) {
     send_to_char("Players\r\n-------\r\n", ch);
@@ -1341,18 +1424,22 @@ void perform_immort_where(struct char_da
     if (!found)
       send_to_char("Couldn't find any such thing.\r\n", ch);
   }
+  release_buffer(buf);
 }
 
 
 
 ACMD(do_where)
 {
+  char *arg = get_buffer(MAX_STRING_LENGTH);
   one_argument(argument, arg);
 
   if (GET_LEVEL(ch) >= LVL_IMMORT)
     perform_immort_where(ch, arg);
   else
     perform_mortal_where(ch, arg);
+
+  release_buffer(arg);
 }
 
 
@@ -1360,11 +1447,13 @@ ACMD(do_where)
 ACMD(do_levels)
 {
   int i;
+  char *buf;
 
   if (IS_NPC(ch)) {
     send_to_char("You ain't nothin' but a hound-dog.\r\n", ch);
     return;
   }
+  buf = get_buffer(MAX_STRING_LENGTH);
   *buf = '\0';
 
   for (i = 1; i < LVL_IMMORT; i++) {
@@ -1385,6 +1474,7 @@ ACMD(do_levels)
     strcat(buf, "\r\n");
   }
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -1393,13 +1483,16 @@ ACMD(do_consider)
 {
   struct char_data *victim;
   int diff;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   one_argument(argument, buf);
 
   if (!(victim = get_char_room_vis(ch, buf))) {
     send_to_char("Consider killing who?\r\n", ch);
+    release_buffer(buf);
     return;
   }
+  release_buffer(buf);
   if (victim == ch) {
     send_to_char("Easy!  Very easy indeed!\r\n", ch);
     return;
@@ -1440,12 +1533,14 @@ ACMD(do_consider)
 ACMD(do_diagnose)
 {
   struct char_data *vict;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   one_argument(argument, buf);
 
   if (*buf) {
     if (!(vict = get_char_room_vis(ch, buf))) {
       send_to_char(NOPERSON, ch);
+      release_buffer(buf);
       return;
     } else
       diag_char_to_char(vict, ch);
@@ -1455,6 +1550,7 @@ ACMD(do_diagnose)
     else
       send_to_char("Diagnose who?\r\n", ch);
   }
+  release_buffer(buf);
 }
 
 
@@ -1464,34 +1560,45 @@ static char *ctypes[] = {
 ACMD(do_color)
 {
   int tp;
+  char *arg;
 
   if (IS_NPC(ch))
     return;
 
+  arg = get_buffer(MAX_STRING_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg) {
-    sprintf(buf, "Your current color level is %s.\r\n", ctypes[COLOR_LEV(ch)]);
-    send_to_char(buf, ch);
+    sprintf(arg, "Your current color level is %s.\r\n", ctypes[COLOR_LEV(ch)]);
+    send_to_char(arg, ch);
+    release_buffer(arg);
     return;
   }
   if (((tp = search_block(arg, ctypes, FALSE)) == -1)) {
     send_to_char("Usage: color { Off | Sparse | Normal | Complete }\r\n", ch);
+    release_buffer(arg);
     return;
   }
   REMOVE_BIT(PRF_FLAGS(ch), PRF_COLOR_1 | PRF_COLOR_2);
   SET_BIT(PRF_FLAGS(ch), (PRF_COLOR_1 * (tp & 1)) | (PRF_COLOR_2 * (tp & 2) >> 1));
 
-  sprintf(buf, "Your %scolor%s is now %s.\r\n", CCRED(ch, C_SPR),
+  sprintf(arg, "Your %scolor%s is now %s.\r\n", CCRED(ch, C_SPR),
 	  CCNRM(ch, C_OFF), ctypes[tp]);
-  send_to_char(buf, ch);
+  send_to_char(arg, ch);
+  release_buffer(arg);
 }
 
 
 ACMD(do_toggle)
 {
+  char *buf2, *buf;
+
   if (IS_NPC(ch))
     return;
+
+  buf2 = get_buffer(4);
+  buf = get_buffer(MAX_STRING_LENGTH);
+
   if (GET_WIMP_LEV(ch) == 0)
     strcpy(buf2, "OFF");
   else
@@ -1543,6 +1650,8 @@ ACMD(do_toggle)
 	  ctypes[COLOR_LEV(ch)]);
 
   send_to_char(buf, ch);
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
@@ -1599,16 +1708,19 @@ ACMD(do_commands)
   int no, i, cmd_num;
   int wizhelp = 0, socials = 0;
   struct char_data *vict;
+  char *buf, *arg = get_buffer(MAX_STRING_LENGTH);
 
   one_argument(argument, arg);
 
   if (*arg) {
     if (!(vict = get_char_vis(ch, arg)) || IS_NPC(vict)) {
       send_to_char("Who is that?\r\n", ch);
+      release_buffer(arg);
       return;
     }
     if (GET_LEVEL(ch) < GET_LEVEL(vict)) {
       send_to_char("You can't see the commands of people above your level.\r\n", ch);
+      release_buffer(arg);
       return;
     }
   } else
@@ -1619,6 +1731,7 @@ ACMD(do_commands)
   else if (subcmd == SCMD_WIZHELP)
     wizhelp = 1;
 
+  buf = get_buffer(MAX_STRING_LENGTH);
   sprintf(buf, "The following %s%s are available to %s:\r\n",
 	  wizhelp ? "privileged " : "",
 	  socials ? "socials" : "commands",
@@ -1640,4 +1753,6 @@ ACMD(do_commands)
 
   strcat(buf, "\r\n");
   send_to_char(buf, ch);
+  release_buffer(arg);
+  release_buffer(buf);
 }
diff -uprN -x *.o ../stk/act.item.c ./act.item.c
--- ../stk/act.item.c	Thu Jun 19 00:58:35 1997
+++ ./act.item.c	Tue Aug 12 17:23:08 1997
@@ -53,8 +53,9 @@ void perform_put(struct char_data * ch, 
 
 ACMD(do_put)
 {
-  char arg1[MAX_INPUT_LENGTH];
-  char arg2[MAX_INPUT_LENGTH];
+  char	*arg1 = get_buffer(MAX_INPUT_LENGTH),
+	*arg2 = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(128);
   struct obj_data *obj, *next_obj, *cont;
   struct char_data *tmp_char;
   int obj_dotmode, cont_dotmode, found = 0;
@@ -109,6 +110,9 @@ ACMD(do_put)
       }
     }
   }
+  release_buffer(buf);
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
@@ -134,8 +138,10 @@ void get_check_money(struct char_data * 
   if ((GET_OBJ_TYPE(obj) == ITEM_MONEY) && (GET_OBJ_VAL(obj, 0) > 0)) {
     obj_from_char(obj);
     if (GET_OBJ_VAL(obj, 0) > 1) {
+      char *buf = get_buffer(64);
       sprintf(buf, "There were %d coins.\r\n", GET_OBJ_VAL(obj, 0));
       send_to_char(buf, ch);
+      release_buffer(buf);
     }
     GET_GOLD(ch) += GET_OBJ_VAL(obj, 0);
     extract_obj(obj);
@@ -172,8 +178,10 @@ void get_from_container(struct char_data
     act("$p is closed.", FALSE, ch, cont, 0, TO_CHAR);
   else if (obj_dotmode == FIND_INDIV) {
     if (!(obj = get_obj_in_list_vis(ch, arg, cont->contains))) {
+      char *buf = get_buffer(128);
       sprintf(buf, "There doesn't seem to be %s %s in $p.", AN(arg), arg);
       act(buf, FALSE, ch, cont, 0, TO_CHAR);
+      release_buffer(buf);
     } else
       perform_get_from_container(ch, obj, cont, mode);
   } else {
@@ -193,8 +201,10 @@ void get_from_container(struct char_data
       if (obj_dotmode == FIND_ALL)
 	act("$p seems to be empty.", FALSE, ch, cont, 0, TO_CHAR);
       else {
+	char *buf = get_buffer(128);
 	sprintf(buf, "You can't seem to find any %ss in $p.", arg);
 	act(buf, FALSE, ch, cont, 0, TO_CHAR);
+	release_buffer(buf);
       }
     }
   }
@@ -224,8 +234,10 @@ void get_from_room(struct char_data * ch
 
   if (dotmode == FIND_INDIV) {
     if (!(obj = get_obj_in_list_vis(ch, arg, world[ch->in_room].contents))) {
+      char *buf = get_buffer(128);
       sprintf(buf, "You don't see %s %s here.\r\n", AN(arg), arg);
       send_to_char(buf, ch);
+      release_buffer(buf);
     } else
       perform_get_from_room(ch, obj);
   } else {
@@ -245,8 +257,10 @@ void get_from_room(struct char_data * ch
       if (dotmode == FIND_ALL)
 	send_to_char("There doesn't seem to be anything here.\r\n", ch);
       else {
+	char *buf = get_buffer(128);
 	sprintf(buf, "You don't see any %ss here.\r\n", arg);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       }
     }
   }
@@ -256,8 +270,8 @@ void get_from_room(struct char_data * ch
 
 ACMD(do_get)
 {
-  char arg1[MAX_INPUT_LENGTH];
-  char arg2[MAX_INPUT_LENGTH];
+  char *arg1 = get_buffer(MAX_INPUT_LENGTH);
+  char *arg2 = get_buffer(MAX_INPUT_LENGTH);
 
   int cont_dotmode, found = 0, mode;
   struct obj_data *cont;
@@ -276,17 +290,17 @@ ACMD(do_get)
     if (cont_dotmode == FIND_INDIV) {
       mode = generic_find(arg2, FIND_OBJ_INV | FIND_OBJ_ROOM, ch, &tmp_char, &cont);
       if (!cont) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "You don't have %s %s.\r\n", AN(arg2), arg2);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       } else if (GET_OBJ_TYPE(cont) != ITEM_CONTAINER)
 	act("$p is not a container.", FALSE, ch, cont, 0, TO_CHAR);
       else
 	get_from_container(ch, cont, arg1, mode);
-    } else {
-      if (cont_dotmode == FIND_ALLDOT && !*arg2) {
+    } else if (cont_dotmode == FIND_ALLDOT && !*arg2)
 	send_to_char("Get from all of what?\r\n", ch);
-	return;
-      }
+    else {
       for (cont = ch->carrying; cont; cont = cont->next_content)
 	if (CAN_SEE_OBJ(ch, cont) &&
 	    (cont_dotmode == FIND_ALL || isname(arg2, cont->name)))
@@ -311,12 +325,16 @@ ACMD(do_get)
 	if (cont_dotmode == FIND_ALL)
 	  send_to_char("You can't seem to find any containers.\r\n", ch);
 	else {
+	  char *buf = get_buffer(SMALL_BUFSIZE);
 	  sprintf(buf, "You can't seem to find any %ss here.\r\n", arg2);
 	  send_to_char(buf, ch);
+	  release_buffer(buf);
 	}
       }
     }
   }
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
@@ -324,6 +342,7 @@ void perform_drop_gold(struct char_data 
 		            byte mode, sh_int RDR)
 {
   struct obj_data *obj;
+  char *buf = get_buffer(SMALL_BUFSIZE);
 
   if (amount <= 0)
     send_to_char("Heh heh heh.. we are jolly funny today, eh?\r\n", ch);
@@ -353,6 +372,7 @@ void perform_drop_gold(struct char_data 
     }
     GET_GOLD(ch) -= amount;
   }
+  release_buffer(buf);
 }
 
 
@@ -362,17 +382,20 @@ void perform_drop_gold(struct char_data 
 int perform_drop(struct char_data * ch, struct obj_data * obj,
 		     byte mode, char *sname, sh_int RDR)
 {
+  char *buf = get_buffer(SMALL_BUFSIZE);
   int value;
 
   if (IS_OBJ_STAT(obj, ITEM_NODROP)) {
     sprintf(buf, "You can't %s $p, it must be CURSED!", sname);
     act(buf, FALSE, ch, obj, 0, TO_CHAR);
+    release_buffer(buf);
     return 0;
   }
   sprintf(buf, "You %s $p.%s", sname, VANISH(mode));
   act(buf, FALSE, ch, obj, 0, TO_CHAR);
   sprintf(buf, "$n %ss $p.%s", sname, VANISH(mode));
   act(buf, TRUE, ch, obj, 0, TO_ROOM);
+  release_buffer(buf);
   obj_from_char(obj);
 
   if ((mode == SCMD_DONATE) && IS_OBJ_STAT(obj, ITEM_NODONATE))
@@ -414,7 +437,7 @@ ACMD(do_drop)
   sh_int RDR = 0;
   byte mode = SCMD_DROP;
   int dotmode, amount = 0;
-  char *sname;
+  char *sname, *arg = get_buffer(MAX_INPUT_LENGTH);
 
   switch (subcmd) {
   case SCMD_JUNK:
@@ -449,8 +472,9 @@ ACMD(do_drop)
   argument = one_argument(argument, arg);
 
   if (!*arg) {
-    sprintf(buf, "What do you want to %s?\r\n", sname);
-    send_to_char(buf, ch);
+    sprintf(arg, "What do you want to %s?\r\n", sname);
+    send_to_char(arg, ch);
+    release_buffer(arg);
     return;
   } else if (is_number(arg)) {
     amount = atoi(arg);
@@ -483,13 +507,15 @@ ACMD(do_drop)
 	}
     } else if (dotmode == FIND_ALLDOT) {
       if (!*arg) {
-	sprintf(buf, "What do you want to %s all of?\r\n", sname);
-	send_to_char(buf, ch);
+	sprintf(arg, "What do you want to %s all of?\r\n", sname);
+	send_to_char(arg, ch);
 	return;
       }
       if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "You don't seem to have any %ss.\r\n", arg);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       }
       while (obj) {
 	next_obj = get_obj_in_list_vis(ch, arg, obj->next_content);
@@ -498,8 +524,10 @@ ACMD(do_drop)
       }
     } else {
       if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       } else
 	amount += perform_drop(ch, obj, mode, sname, RDR);
     }
@@ -557,6 +585,7 @@ struct char_data *give_find_vict(struct 
 void perform_give_gold(struct char_data * ch, struct char_data * vict,
 		            int amount)
 {
+  char *buf;
   if (amount <= 0) {
     send_to_char("Heh heh heh ... we are jolly funny today, eh?\r\n", ch);
     return;
@@ -566,10 +595,12 @@ void perform_give_gold(struct char_data 
     return;
   }
   send_to_char(OK, ch);
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "$n gives you %d gold coins.", amount);
   act(buf, FALSE, ch, 0, vict, TO_VICT);
   sprintf(buf, "$n gives %s to $N.", money_desc(amount));
   act(buf, TRUE, ch, 0, vict, TO_NOTVICT);
+  release_buffer(buf);
   if (IS_NPC(ch) || (GET_LEVEL(ch) < LVL_GOD))
     GET_GOLD(ch) -= amount;
   GET_GOLD(vict) += amount;
@@ -581,6 +612,8 @@ ACMD(do_give)
   int amount, dotmode;
   struct char_data *vict;
   struct obj_data *obj, *next_obj;
+  char	*arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf1 = get_buffer(MAX_INPUT_LENGTH);
 
   argument = one_argument(argument, arg);
 
@@ -593,11 +626,9 @@ ACMD(do_give)
       argument = one_argument(argument, arg);
       if ((vict = give_find_vict(ch, arg)))
 	perform_give_gold(ch, vict, amount);
-      return;
     } else {
       /* code to give multiple items.  anyone want to write it? -je */
       send_to_char("You can't give more than one item at a time.\r\n", ch);
-      return;
     }
   } else {
     one_argument(argument, buf1);
@@ -606,16 +637,16 @@ ACMD(do_give)
     dotmode = find_all_dots(arg);
     if (dotmode == FIND_INDIV) {
       if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+	char *buf = get_buffer(128);
 	sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       } else
 	perform_give(ch, vict, obj);
     } else {
-      if (dotmode == FIND_ALLDOT && !*arg) {
+      if (dotmode == FIND_ALLDOT && !*arg)
 	send_to_char("All of what?\r\n", ch);
-	return;
-      }
-      if (!ch->carrying)
+      else if (!ch->carrying)
 	send_to_char("You don't seem to be holding anything.\r\n", ch);
       else
 	for (obj = ch->carrying; obj; obj = next_obj) {
@@ -626,6 +657,8 @@ ACMD(do_give)
 	}
     }
   }
+  release_buffer(arg);
+  release_buffer(buf1);
 }
 
 
@@ -691,20 +724,25 @@ ACMD(do_drink)
   struct affected_type af;
   int amount, weight;
   int on_ground = 0;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
   if (!*arg) {
     send_to_char("Drink from what?\r\n", ch);
+    release_buffer(arg);
     return;
   }
   if (!(temp = get_obj_in_list_vis(ch, arg, ch->carrying))) {
     if (!(temp = get_obj_in_list_vis(ch, arg, world[ch->in_room].contents))) {
       act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR);
+      release_buffer(arg);
       return;
     } else
       on_ground = 1;
   }
+  release_buffer(arg);
+
   if ((GET_OBJ_TYPE(temp) != ITEM_DRINKCON) &&
       (GET_OBJ_TYPE(temp) != ITEM_FOUNTAIN)) {
     send_to_char("You can't drink from that!\r\n", ch);
@@ -729,21 +767,26 @@ ACMD(do_drink)
     return;
   }
   if (subcmd == SCMD_DRINK) {
+    char *buf = get_buffer(128);
     sprintf(buf, "$n drinks %s from $p.", drinks[GET_OBJ_VAL(temp, 2)]);
     act(buf, TRUE, ch, temp, 0, TO_ROOM);
 
     sprintf(buf, "You drink the %s.\r\n", drinks[GET_OBJ_VAL(temp, 2)]);
     send_to_char(buf, ch);
 
+    release_buffer(buf);
+
     if (drink_aff[GET_OBJ_VAL(temp, 2)][DRUNK] > 0)
       amount = (25 - GET_COND(ch, THIRST)) / drink_aff[GET_OBJ_VAL(temp, 2)][DRUNK];
     else
       amount = number(3, 10);
 
   } else {
+    char *buf = get_buffer(128);
     act("$n sips from $p.", TRUE, ch, temp, 0, TO_ROOM);
     sprintf(buf, "It tastes like %s.\r\n", drinks[GET_OBJ_VAL(temp, 2)]);
     send_to_char(buf, ch);
+    release_buffer(buf);
     amount = 1;
   }
 
@@ -800,7 +843,7 @@ ACMD(do_eat)
   struct obj_data *food;
   struct affected_type af;
   int amount;
-
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg) {
@@ -808,8 +851,10 @@ ACMD(do_eat)
     return;
   }
   if (!(food = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+    char *buf = get_buffer(128);
     sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
     send_to_char(buf, ch);
+    release_buffer(buf);
     return;
   }
   if (subcmd == SCMD_TASTE && ((GET_OBJ_TYPE(food) == ITEM_DRINKCON) ||
@@ -865,8 +910,9 @@ ACMD(do_eat)
 
 ACMD(do_pour)
 {
-  char arg1[MAX_INPUT_LENGTH];
-  char arg2[MAX_INPUT_LENGTH];
+#warning BUFFER: do_pour relies on release_and_return;
+  char *arg1 = get_buffer(MAX_INPUT_LENGTH);
+  char *arg2 = get_buffer(MAX_INPUT_LENGTH);
   struct obj_data *from_obj = NULL, *to_obj = NULL;
   int amount;
 
@@ -875,52 +921,54 @@ ACMD(do_pour)
   if (subcmd == SCMD_POUR) {
     if (!*arg1) {		/* No arguments */
       act("From what do you want to pour?", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if (!(from_obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) {
       act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if (GET_OBJ_TYPE(from_obj) != ITEM_DRINKCON) {
       act("You can't pour from that!", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
   }
   if (subcmd == SCMD_FILL) {
     if (!*arg1) {		/* no arguments */
       send_to_char("What do you want to fill?  And what are you filling it from?\r\n", ch);
-      return;
+      release_and_return;
     }
     if (!(to_obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) {
       send_to_char("You can't find it!", ch);
-      return;
+      release_and_return;
     }
     if (GET_OBJ_TYPE(to_obj) != ITEM_DRINKCON) {
       act("You can't fill $p!", FALSE, ch, to_obj, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if (!*arg2) {		/* no 2nd argument */
       act("What do you want to fill $p from?", FALSE, ch, to_obj, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if (!(from_obj = get_obj_in_list_vis(ch, arg2, world[ch->in_room].contents))) {
+      char *buf = get_buffer(128);
       sprintf(buf, "There doesn't seem to be %s %s here.\r\n", AN(arg2), arg2);
       send_to_char(buf, ch);
-      return;
+      release_buffer(buf);
+      release_and_return;
     }
     if (GET_OBJ_TYPE(from_obj) != ITEM_FOUNTAIN) {
       act("You can't fill something from $p.", FALSE, ch, from_obj, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
   }
   if (GET_OBJ_VAL(from_obj, 1) == 0) {
     act("The $p is empty.", FALSE, ch, from_obj, 0, TO_CHAR);
-    return;
+    release_and_return;
   }
   if (subcmd == SCMD_POUR) {	/* pour */
     if (!*arg2) {
       act("Where do you want it?  Out or in what?", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if (!str_cmp(arg2, "out")) {
       act("$n empties $p.", TRUE, ch, from_obj, 0, TO_ROOM);
@@ -933,35 +981,37 @@ ACMD(do_pour)
       GET_OBJ_VAL(from_obj, 3) = 0;
       name_from_drinkcon(from_obj);
 
-      return;
+      release_and_return;
     }
     if (!(to_obj = get_obj_in_list_vis(ch, arg2, ch->carrying))) {
       act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
     if ((GET_OBJ_TYPE(to_obj) != ITEM_DRINKCON) &&
 	(GET_OBJ_TYPE(to_obj) != ITEM_FOUNTAIN)) {
       act("You can't pour anything into that.", FALSE, ch, 0, 0, TO_CHAR);
-      return;
+      release_and_return;
     }
   }
   if (to_obj == from_obj) {
     act("A most unproductive effort.", FALSE, ch, 0, 0, TO_CHAR);
-    return;
+    release_and_return;
   }
   if ((GET_OBJ_VAL(to_obj, 1) != 0) &&
       (GET_OBJ_VAL(to_obj, 2) != GET_OBJ_VAL(from_obj, 2))) {
     act("There is already another liquid in it!", FALSE, ch, 0, 0, TO_CHAR);
-    return;
+    release_and_return;
   }
   if (!(GET_OBJ_VAL(to_obj, 1) < GET_OBJ_VAL(to_obj, 0))) {
     act("There is no room for more.", FALSE, ch, 0, 0, TO_CHAR);
-    return;
+    release_and_return;
   }
   if (subcmd == SCMD_POUR) {
+    char *buf = get_buffer(128);
     sprintf(buf, "You pour the %s into the %s.",
 	    drinks[GET_OBJ_VAL(from_obj, 2)], arg2);
     send_to_char(buf, ch);
+    release_buffer(buf);
   }
   if (subcmd == SCMD_FILL) {
     act("You gently fill $p from $P.", FALSE, ch, to_obj, from_obj, TO_CHAR);
@@ -996,7 +1046,7 @@ ACMD(do_pour)
   weight_change_object(from_obj, -amount);
   weight_change_object(to_obj, amount);	/* Add weight */
 
-  return;
+  release_and_return;
 }
 
 
@@ -1163,8 +1213,10 @@ int find_eq_pos(struct char_data * ch, s
     if (CAN_WEAR(obj, ITEM_WEAR_WRIST))       where = WEAR_WRIST_R;
   } else {
     if ((where = search_block(arg, keywords, FALSE)) < 0) {
+      char *buf = get_buffer(128);
       sprintf(buf, "'%s'?  What part of your body is THAT?\r\n", arg);
       send_to_char(buf, ch);
+      release_buffer(buf);
     }
   }
 
@@ -1175,8 +1227,8 @@ int find_eq_pos(struct char_data * ch, s
 
 ACMD(do_wear)
 {
-  char arg1[MAX_INPUT_LENGTH];
-  char arg2[MAX_INPUT_LENGTH];
+  char *arg1 = get_buffer(MAX_INPUT_LENGTH);
+  char *arg2 = get_buffer(MAX_INPUT_LENGTH);
   struct obj_data *obj, *next_obj;
   int where, dotmode, items_worn = 0;
 
@@ -1184,12 +1236,16 @@ ACMD(do_wear)
 
   if (!*arg1) {
     send_to_char("Wear what?\r\n", ch);
+    release_buffer(arg1);
+    release_buffer(arg2);
     return;
   }
   dotmode = find_all_dots(arg1);
 
   if (*arg2 && (dotmode != FIND_INDIV)) {
     send_to_char("You can't specify the same body location for more than one item!\r\n", ch);
+    release_buffer(arg1);
+    release_buffer(arg2);
     return;
   }
   if (dotmode == FIND_ALL) {
@@ -1205,11 +1261,15 @@ ACMD(do_wear)
   } else if (dotmode == FIND_ALLDOT) {
     if (!*arg1) {
       send_to_char("Wear all of what?\r\n", ch);
+      release_buffer(arg1);
+      release_buffer(arg2);
       return;
     }
     if (!(obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) {
+      char *buf = get_buffer(128);
       sprintf(buf, "You don't seem to have any %ss.\r\n", arg1);
       send_to_char(buf, ch);
+      release_buffer(buf);
     } else
       while (obj) {
 	next_obj = get_obj_in_list_vis(ch, arg1, obj->next_content);
@@ -1221,8 +1281,10 @@ ACMD(do_wear)
       }
   } else {
     if (!(obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) {
+      char *buf = get_buffer(128);
       sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg1), arg1);
       send_to_char(buf, ch);
+      release_buffer(buf);
     } else {
       if ((where = find_eq_pos(ch, obj, arg2)) >= 0)
 	perform_wear(ch, obj, where);
@@ -1230,6 +1292,8 @@ ACMD(do_wear)
 	act("You can't wear $p.", FALSE, ch, obj, 0, TO_CHAR);
     }
   }
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
@@ -1237,14 +1301,16 @@ ACMD(do_wear)
 ACMD(do_wield)
 {
   struct obj_data *obj;
-
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg)
     send_to_char("Wield what?\r\n", ch);
   else if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+    char *buf = get_buffer(128);
     sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
     send_to_char(buf, ch);
+    release_buffer(buf);
   } else {
     if (!CAN_WEAR(obj, ITEM_WEAR_WIELD))
       send_to_char("You can't wield that.\r\n", ch);
@@ -1253,6 +1319,7 @@ ACMD(do_wield)
     else
       perform_wear(ch, obj, WEAR_WIELD);
   }
+  release_buffer(arg);
 }
 
 
@@ -1260,14 +1327,17 @@ ACMD(do_wield)
 ACMD(do_grab)
 {
   struct obj_data *obj;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
   if (!*arg)
     send_to_char("Hold what?\r\n", ch);
   else if (!(obj = get_obj_in_list_vis(ch, arg, ch->carrying))) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
     send_to_char(buf, ch);
+    release_buffer(buf);
   } else {
     if (GET_OBJ_TYPE(obj) == ITEM_LIGHT)
       perform_wear(ch, obj, WEAR_LIGHT);
@@ -1280,6 +1350,7 @@ ACMD(do_grab)
 	perform_wear(ch, obj, WEAR_HOLD);
     }
   }
+  release_buffer(arg);
 }
 
 
@@ -1307,14 +1378,18 @@ ACMD(do_remove)
 {
   struct obj_data *obj;
   int i, dotmode, found;
+  char	*arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf;
 
   one_argument(argument, arg);
 
   if (!*arg) {
     send_to_char("Remove what?\r\n", ch);
+    release_buffer(arg);
     return;
   }
   dotmode = find_all_dots(arg);
+  buf = get_buffer(SMALL_BUFSIZE);
 
   if (dotmode == FIND_ALL) {
     found = 0;
@@ -1348,4 +1423,6 @@ ACMD(do_remove)
     } else
       perform_remove(ch, i);
   }
+  release_buffer(arg);
+  release_buffer(buf);
 }
diff -uprN -x *.o ../stk/act.movement.c ./act.movement.c
--- ../stk/act.movement.c	Thu Jun 19 00:58:35 1997
+++ ./act.movement.c	Sun Aug  3 20:27:48 1997
@@ -128,8 +128,10 @@ int do_simple_move(struct char_data *ch,
     GET_MOVE(ch) -= need_movement;
 
   if (!IS_AFFECTED(ch, AFF_SNEAK)) {
+    char *buf2 = get_buffer(64);
     sprintf(buf2, "$n leaves %s.", dirs[dir]);
     act(buf2, TRUE, ch, 0, 0, TO_ROOM);
+    release_buffer(buf2);
   }
   was_in = ch->in_room;
   char_from_room(ch);
@@ -162,8 +164,10 @@ int perform_move(struct char_data *ch, i
     send_to_char("Alas, you cannot go that way...\r\n", ch);
   else if (IS_SET(EXIT(ch, dir)->exit_info, EX_CLOSED)) {
     if (EXIT(ch, dir)->keyword) {
+      char *buf2 = get_buffer(64);
       sprintf(buf2, "The %s seems to be closed.\r\n", fname(EXIT(ch, dir)->keyword));
       send_to_char(buf2, ch);
+      release_buffer(buf2);
     } else
       send_to_char("It seems to be closed.\r\n", ch);
   } else {
@@ -213,8 +217,10 @@ int find_door(struct char_data *ch, char
 	if (isname(type, EXIT(ch, door)->keyword))
 	  return door;
 	else {
+	  char *buf2 = get_buffer(64);
 	  sprintf(buf2, "I see no %s there.\r\n", type);
 	  send_to_char(buf2, ch);
+	  release_buffer(buf2);
 	  return -1;
       } else
 	return door;
@@ -223,9 +229,11 @@ int find_door(struct char_data *ch, char
       return -1;
     }
   } else {			/* try to locate the keyword */
+    char *buf2 = get_buffer(128);
     if (!*type) {
       sprintf(buf2, "What is it you want to %s?\r\n", cmdname);
       send_to_char(buf2, ch);
+      release_buffer(buf2);
       return -1;
     }
     for (door = 0; door < NUM_OF_DIRS; door++)
@@ -236,6 +244,7 @@ int find_door(struct char_data *ch, char
 
     sprintf(buf2, "There doesn't seem to be %s %s here.\r\n", AN(type), type);
     send_to_char(buf2, ch);
+    release_buffer(buf2);
     return -1;
   }
 }
@@ -294,6 +303,7 @@ void do_doorcmd(struct char_data *ch, st
 {
   int other_room = 0;
   struct room_direction_data *back = 0;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   sprintf(buf, "$n %ss ", cmd_door[scmd]);
   if (!obj && ((other_room = EXIT(ch, door)->to_room) != NOWHERE))
@@ -341,6 +351,7 @@ void do_doorcmd(struct char_data *ch, st
       act(buf, FALSE, world[EXIT(ch, door)->to_room].people, 0, 0, TO_CHAR);
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -389,16 +400,20 @@ int ok_pick(struct char_data *ch, int ke
 ACMD(do_gen_door)
 {
   int door = -1, keynum;
-  char type[MAX_INPUT_LENGTH], dir[MAX_INPUT_LENGTH];
+  char *type, *dir;
   struct obj_data *obj = NULL;
   struct char_data *victim = NULL;
 
   skip_spaces(&argument);
   if (!*argument) {
+    char *buf = get_buffer(64);
     sprintf(buf, "%s what?\r\n", cmd_door[subcmd]);
     send_to_char(CAP(buf), ch);
+    release_buffer(buf);
     return;
   }
+  type = get_buffer(MAX_INPUT_LENGTH);
+  dir = get_buffer(MAX_INPUT_LENGTH);
   two_arguments(argument, type, dir);
   if (!generic_find(type, FIND_OBJ_INV | FIND_OBJ_ROOM, ch, &victim, &obj))
     door = find_door(ch, type, dir, cmd_door[subcmd]);
@@ -425,6 +440,8 @@ ACMD(do_gen_door)
     else if (ok_pick(ch, keynum, DOOR_IS_PICKPROOF(ch, obj, door), subcmd))
       do_doorcmd(ch, obj, door, subcmd);
   }
+  release_buffer(type);
+  release_buffer(dir);
   return;
 }
 
@@ -433,6 +450,7 @@ ACMD(do_gen_door)
 ACMD(do_enter)
 {
   int door;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
 
@@ -443,10 +461,11 @@ ACMD(do_enter)
 	if (EXIT(ch, door)->keyword)
 	  if (!str_cmp(EXIT(ch, door)->keyword, buf)) {
 	    perform_move(ch, door, 1);
+            release_buffer(buf);
 	    return;
 	  }
-    sprintf(buf2, "There is no %s here.\r\n", buf);
-    send_to_char(buf2, ch);
+    sprintf(buf, "There is no %s here.\r\n", buf);
+    send_to_char(buf, ch);
   } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_INDOORS))
     send_to_char("You are already indoors.\r\n", ch);
   else {
@@ -457,10 +476,12 @@ ACMD(do_enter)
 	  if (!IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED) &&
 	      IS_SET(ROOM_FLAGS(EXIT(ch, door)->to_room), ROOM_INDOORS)) {
 	    perform_move(ch, door, 1);
+            release_buffer(buf);
 	    return;
 	  }
     send_to_char("You can't seem to find anything to enter.\r\n", ch);
   }
+  release_buffer(buf);
 }
 
 
@@ -611,6 +632,7 @@ ACMD(do_wake)
 {
   struct char_data *vict;
   int self = 0;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
   if (*arg) {
@@ -631,9 +653,12 @@ ACMD(do_wake)
       act("You are awakened by $n.", FALSE, ch, 0, vict, TO_VICT | TO_SLEEP);
       GET_POS(vict) = POS_SITTING;
     }
-    if (!self)
+    if (!self) {
+      release_buffer(arg);
       return;
+    }
   }
+  release_buffer(arg);
   if (IS_AFFECTED(ch, AFF_SLEEP))
     send_to_char("You can't wake up!\r\n", ch);
   else if (GET_POS(ch) > POS_SLEEPING)
@@ -649,6 +674,7 @@ ACMD(do_wake)
 ACMD(do_follow)
 {
   struct char_data *leader;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   void stop_follower(struct char_data *ch);
   void add_follower(struct char_data *ch, struct char_data *leader);
@@ -658,13 +684,16 @@ ACMD(do_follow)
   if (*buf) {
     if (!(leader = get_char_room_vis(ch, buf))) {
       send_to_char(NOPERSON, ch);
+      release_buffer(buf);
       return;
     }
   } else {
     send_to_char("Whom do you wish to follow?\r\n", ch);
+    release_buffer(buf);
     return;
   }
 
+  release_buffer(buf);
   if (ch->master == leader) {
     act("You are already following $M.", FALSE, ch, 0, leader, TO_CHAR);
     return;
diff -uprN -x *.o ../stk/act.offensive.c ./act.offensive.c
--- ../stk/act.offensive.c	Thu Jun 19 00:58:36 1997
+++ ./act.offensive.c	Sun Aug  3 21:05:36 1997
@@ -33,11 +33,13 @@ void raw_kill(struct char_data * ch);
 ACMD(do_assist)
 {
   struct char_data *helpee, *opponent;
+  char *arg;
 
   if (FIGHTING(ch)) {
     send_to_char("You're already fighting!  How can you assist someone else?\r\n", ch);
     return;
   }
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg)
@@ -66,12 +68,14 @@ ACMD(do_assist)
       hit(ch, opponent, TYPE_UNDEFINED);
     }
   }
+  release_buffer(arg);
 }
 
 
 ACMD(do_hit)
 {
   struct char_data *vict;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -85,21 +89,18 @@ ACMD(do_hit)
   } else if (IS_AFFECTED(ch, AFF_CHARM) && (ch->master == vict))
     act("$N is just such a good friend, you simply can't hit $M.", FALSE, ch, 0, vict, TO_CHAR);
   else {
-    if (!pk_allowed) {
-      if (!IS_NPC(vict) && !IS_NPC(ch) && (subcmd != SCMD_MURDER)) {
-	send_to_char("Use 'murder' to hit another player.\r\n", ch);
-	return;
-      }
-      if (IS_AFFECTED(ch, AFF_CHARM) && !IS_NPC(ch->master) && !IS_NPC(vict))
-	return;			/* you can't order a charmed pet to attack a
-				 * player */
-    }
-    if ((GET_POS(ch) == POS_STANDING) && (vict != FIGHTING(ch))) {
+    if (!pk_allowed && !IS_NPC(vict) && !IS_NPC(ch) && (subcmd != SCMD_MURDER))
+      send_to_char("Use 'murder' to hit another player.\r\n", ch);
+    else if (!pk_allowed && IS_AFFECTED(ch, AFF_CHARM) && !IS_NPC(ch->master) && !IS_NPC(vict))
+	/* you can't order a charmed pet to attack a player */
+      send_to_char("Naughty, naughty.\r\n", ch->master);
+    else if ((GET_POS(ch) == POS_STANDING) && (vict != FIGHTING(ch))) {
       hit(ch, vict, TYPE_UNDEFINED);
       WAIT_STATE(ch, PULSE_VIOLENCE + 2);
     } else
       send_to_char("You do the best you can!\r\n", ch);
   }
+  release_buffer(arg);
 }
 
 
@@ -107,11 +108,13 @@ ACMD(do_hit)
 ACMD(do_kill)
 {
   struct char_data *vict;
+  char *arg;
 
   if ((GET_LEVEL(ch) < LVL_IMPL) || IS_NPC(ch)) {
     do_hit(ch, argument, cmd, subcmd);
     return;
   }
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg) {
@@ -128,6 +131,7 @@ ACMD(do_kill)
       raw_kill(vict);
     }
   }
+  release_buffer(arg);
 }
 
 
@@ -136,13 +140,16 @@ ACMD(do_backstab)
 {
   struct char_data *vict;
   int percent, prob;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
 
   if (!(vict = get_char_room_vis(ch, buf))) {
     send_to_char("Backstab who?\r\n", ch);
+    release_buffer(buf);
     return;
   }
+  release_buffer(buf);
   if (vict == ch) {
     send_to_char("How can you sneak up on yourself?\r\n", ch);
     return;
@@ -181,8 +188,9 @@ ACMD(do_backstab)
 
 ACMD(do_order)
 {
-  char name[100], message[256];
-  char buf[256];
+  char	*name = get_buffer(100),
+	*message = get_buffer(256),
+	*buf = get_buffer(256);
   bool found = FALSE;
   int org_room;
   struct char_data *vict;
@@ -196,13 +204,10 @@ ACMD(do_order)
     send_to_char("That person isn't here.\r\n", ch);
   else if (ch == vict)
     send_to_char("You obviously suffer from skitzofrenia.\r\n", ch);
-
   else {
     if (IS_AFFECTED(ch, AFF_CHARM)) {
       send_to_char("Your superior would not aprove of you giving orders.\r\n", ch);
-      return;
-    }
-    if (vict) {
+    } else if (vict) {
       sprintf(buf, "$N orders you to '%s'", message);
       act(buf, FALSE, vict, 0, ch, TO_CHAR);
       act("$n gives $N an order.", FALSE, ch, 0, vict, TO_ROOM);
@@ -232,6 +237,9 @@ ACMD(do_order)
 	send_to_char("Nobody here is a loyal subject of yours!\r\n", ch);
     }
   }
+  release_buffer(name);
+  release_buffer(message);
+  release_buffer(buf);
 }
 
 
@@ -271,21 +279,26 @@ ACMD(do_bash)
 {
   struct char_data *vict;
   int percent, prob;
-
-  one_argument(argument, arg);
+  char *arg;
 
   if (GET_CLASS(ch) != CLASS_WARRIOR) {
     send_to_char("You'd better leave all the martial arts to fighters.\r\n", ch);
     return;
   }
+
+  arg = get_buffer(MAX_INPUT_LENGTH);
+  one_argument(argument, arg);
+
   if (!(vict = get_char_room_vis(ch, arg))) {
     if (FIGHTING(ch)) {
       vict = FIGHTING(ch);
     } else {
       send_to_char("Bash who?\r\n", ch);
+      release_buffer(arg);
       return;
     }
   }
+  release_buffer(arg);
   if (vict == ch) {
     send_to_char("Aren't we funny today...\r\n", ch);
     return;
@@ -316,13 +329,16 @@ ACMD(do_rescue)
 {
   struct char_data *vict, *tmp_ch;
   int percent, prob;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
   if (!(vict = get_char_room_vis(ch, arg))) {
+    release_buffer(arg);
     send_to_char("Whom do you want to rescue?\r\n", ch);
     return;
   }
+  release_buffer(arg);
   if (vict == ch) {
     send_to_char("What about fleeing instead?\r\n", ch);
     return;
@@ -373,21 +389,25 @@ ACMD(do_kick)
 {
   struct char_data *vict;
   int percent, prob;
+  char *arg;
 
   if (GET_CLASS(ch) != CLASS_WARRIOR) {
     send_to_char("You'd better leave all the martial arts to fighters.\r\n", ch);
     return;
   }
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!(vict = get_char_room_vis(ch, arg))) {
     if (FIGHTING(ch)) {
       vict = FIGHTING(ch);
     } else {
+      release_buffer(arg);
       send_to_char("Kick who?\r\n", ch);
       return;
     }
   }
+  release_buffer(arg);
   if (vict == ch) {
     send_to_char("Aren't we funny today...\r\n", ch);
     return;
diff -uprN -x *.o ../stk/act.other.c ./act.other.c
--- ../stk/act.other.c	Thu Jun 19 00:58:36 1997
+++ ./act.other.c	Sun Aug  3 22:45:17 1997
@@ -56,10 +56,13 @@ ACMD(do_quit)
     send_to_char("You die before your time...\r\n", ch);
     die(ch);
   } else {
+    char *buf = get_buffer(128);
+
     if (!GET_INVIS_LEV(ch))
       act("$n has left the game.", TRUE, ch, 0, 0, TO_ROOM);
     sprintf(buf, "%s has quit the game.", GET_NAME(ch));
     mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+    release_buffer(buf);
     send_to_char("Goodbye, friend.. Come back soon!\r\n", ch);
 
     /*
@@ -93,8 +96,10 @@ ACMD(do_save)
     return;
 
   if (cmd) {
+    char *buf = get_buffer(64);
     sprintf(buf, "Saving %s.\r\n", GET_NAME(ch));
     send_to_char(buf, ch);
+    release_buffer(buf);
   }
   save_char(ch, NOWHERE);
   Crash_crashsave(ch);
@@ -160,21 +165,25 @@ ACMD(do_steal)
 {
   struct char_data *vict;
   struct obj_data *obj;
-  char vict_name[MAX_INPUT_LENGTH], obj_name[MAX_INPUT_LENGTH];
+  char *vict_name = get_buffer(MAX_INPUT_LENGTH),
+	*obj_name = get_buffer(MAX_INPUT_LENGTH);
   int percent, gold, eq_pos, pcsteal = 0, ohoh = 0;
   extern int pt_allowed;
 
 
   ACMD(do_gen_comm);
 
-  argument = one_argument(argument, obj_name);
-  one_argument(argument, vict_name);
+  two_arguments(argument, obj_name, vict_name);
 
   if (!(vict = get_char_room_vis(ch, vict_name))) {
     send_to_char("Steal what from who?\r\n", ch);
+    release_buffer(vict_name);
+    release_buffer(obj_name);
     return;
   } else if (vict == ch) {
     send_to_char("Come on now, that's rather stupid!\r\n", ch);
+    release_buffer(vict_name);
+    release_buffer(obj_name);
     return;
   }
 
@@ -209,7 +218,6 @@ ACMD(do_steal)
       } else {			/* It is equipment */
 	if ((GET_POS(vict) > POS_STUNNED)) {
 	  send_to_char("Steal the equipment now?  Impossible!\r\n", ch);
-	  return;
 	} else {
 	  act("You unequip $p and steal it.", FALSE, ch, obj, 0, TO_CHAR);
 	  act("$n steals $p from $N.", FALSE, ch, obj, vict, TO_NOTVICT);
@@ -250,8 +258,10 @@ ACMD(do_steal)
 	GET_GOLD(ch) += gold;
 	GET_GOLD(vict) -= gold;
         if (gold > 1) {
+	  char *buf = get_buffer(128);
 	  sprintf(buf, "Bingo!  You got %d gold coins.\r\n", gold);
 	  send_to_char(buf, ch);
+	  release_buffer(buf);
 	} else {
 	  send_to_char("You manage to swipe a solitary gold coin.\r\n", ch);
 	}
@@ -261,6 +271,9 @@ ACMD(do_steal)
     }
   }
 
+  release_buffer(vict_name);
+  release_buffer(obj_name);
+
   if (ohoh && IS_NPC(vict) && AWAKE(vict))
     hit(vict, ch, TYPE_UNDEFINED);
 }
@@ -270,6 +283,7 @@ ACMD(do_steal)
 ACMD(do_practice)
 {
   void list_skills(struct char_data * ch);
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -277,6 +291,8 @@ ACMD(do_practice)
     send_to_char("You can only practice skills in your guild.\r\n", ch);
   else
     list_skills(ch);
+
+  release_buffer(arg);
 }
 
 
@@ -302,6 +318,8 @@ ACMD(do_visible)
 
 ACMD(do_title)
 {
+  char *buf = get_buffer(MAX_TITLE_LENGTH + 40);
+
   skip_spaces(&argument);
   delete_doubledollar(argument);
 
@@ -320,6 +338,7 @@ ACMD(do_title)
     sprintf(buf, "Okay, you're now %s %s.\r\n", GET_NAME(ch), GET_TITLE(ch));
     send_to_char(buf, ch);
   }
+  release_buffer(buf);
 }
 
 
@@ -345,6 +364,8 @@ void print_group(struct char_data *ch)
   if (!IS_AFFECTED(ch, AFF_GROUP))
     send_to_char("But you are not the member of a group!\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_STRING_LENGTH);
+
     send_to_char("Your group consists of:\r\n", ch);
 
     k = (ch->master ? ch->master : ch);
@@ -364,6 +385,7 @@ void print_group(struct char_data *ch)
 	      GET_LEVEL(f->follower), CLASS_ABBR(f->follower));
       act(buf, FALSE, ch, 0, f->follower, TO_CHAR);
     }
+    release_buffer(buf);
   }
 }
 
@@ -374,15 +396,18 @@ ACMD(do_group)
   struct char_data *vict;
   struct follow_type *f;
   int found;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
 
   if (!*buf) {
+    release_buffer(buf);
     print_group(ch);
     return;
   }
 
   if (ch->master) {
+    release_buffer(buf);
     act("You can not enroll group members without being head of a group.",
 	FALSE, ch, 0, 0, TO_CHAR);
     return;
@@ -394,6 +419,7 @@ ACMD(do_group)
       found += perform_group(ch, f->follower);
     if (!found)
       send_to_char("Everyone following you is already in your group.\r\n", ch);
+    release_buffer(buf);
     return;
   }
 
@@ -412,6 +438,7 @@ ACMD(do_group)
       REMOVE_BIT(AFF_FLAGS(vict), AFF_GROUP);
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -421,14 +448,18 @@ ACMD(do_ungroup)
   struct follow_type *f, *next_fol;
   struct char_data *tch;
   void stop_follower(struct char_data * ch);
+  char	*buf = get_buffer(MAX_INPUT_LENGTH),
+	*buf2;
 
   one_argument(argument, buf);
 
   if (!*buf) {
     if (ch->master || !(IS_AFFECTED(ch, AFF_GROUP))) {
       send_to_char("But you lead no group!\r\n", ch);
+      release_buffer(buf);
       return;
     }
+    buf2 = get_buffer(128);
     sprintf(buf2, "%s has disbanded the group.\r\n", GET_NAME(ch));
     for (f = ch->followers; f; f = next_fol) {
       next_fol = f->next;
@@ -439,15 +470,17 @@ ACMD(do_ungroup)
 	  stop_follower(f->follower);
       }
     }
-
+    release_buffer(buf2);
     REMOVE_BIT(AFF_FLAGS(ch), AFF_GROUP);
     send_to_char("You disband the group.\r\n", ch);
     return;
   }
   if (!(tch = get_char_room_vis(ch, buf))) {
     send_to_char("There is no such person!\r\n", ch);
+    release_buffer(buf);
     return;
   }
+  release_buffer(buf);
   if (tch->master != ch) {
     send_to_char("That person is not following you!\r\n", ch);
     return;
@@ -475,11 +508,13 @@ ACMD(do_report)
 {
   struct char_data *k;
   struct follow_type *f;
+  char *buf;
 
   if (!IS_AFFECTED(ch, AFF_GROUP)) {
     send_to_char("But you are not a member of any group!\r\n", ch);
     return;
   }
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "%s reports: %d/%dH, %d/%dM, %d/%dV\r\n",
 	  GET_NAME(ch), GET_HIT(ch), GET_MAX_HIT(ch),
 	  GET_MANA(ch), GET_MAX_MANA(ch),
@@ -495,6 +530,8 @@ ACMD(do_report)
   if (k != ch)
     send_to_char(buf, k);
   send_to_char("You report to the group.\r\n", ch);
+  send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -504,14 +541,17 @@ ACMD(do_split)
   int amount, num, share;
   struct char_data *k;
   struct follow_type *f;
+  char *buf;
 
   if (IS_NPC(ch))
     return;
 
+  buf = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, buf);
 
   if (is_number(buf)) {
     amount = atoi(buf);
+    release_buffer(buf);
     if (amount <= 0) {
       send_to_char("Sorry, you can't do that.\r\n", ch);
       return;
@@ -542,6 +582,7 @@ ACMD(do_split)
 
     GET_GOLD(ch) -= share * (num - 1);
 
+    buf = get_buffer(128);
     if (IS_AFFECTED(k, AFF_GROUP) && (k->in_room == ch->in_room)
 	&& !(IS_NPC(k)) && k != ch) {
       GET_GOLD(k) += share;
@@ -563,10 +604,11 @@ ACMD(do_split)
     sprintf(buf, "You split %d coins among %d members -- %d coins each.\r\n",
 	    amount, num, share);
     send_to_char(buf, ch);
-  } else {
+    release_buffer(buf);
+  } else
     send_to_char("How many coins do you wish to split with your group?\r\n", ch);
-    return;
-  }
+
+  release_buffer(buf);
 }
 
 
@@ -575,11 +617,15 @@ ACMD(do_use)
 {
   struct obj_data *mag_item;
   int equipped = 1;
+  char	*arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_INPUT_LENGTH);
 
   half_chop(argument, arg, buf);
   if (!*arg) {
-    sprintf(buf2, "What do you want to %s?\r\n", CMD_NAME);
-    send_to_char(buf2, ch);
+    sprintf(arg, "What do you want to %s?\r\n", CMD_NAME);
+    send_to_char(arg, ch);
+    release_buffer(arg);
+    release_buffer(buf);
     return;
   }
   mag_item = GET_EQ(ch, WEAR_HOLD);
@@ -590,22 +636,30 @@ ACMD(do_use)
     case SCMD_QUAFF:
       equipped = 0;
       if (!(mag_item = get_obj_in_list_vis(ch, arg, ch->carrying))) {
-	sprintf(buf2, "You don't seem to have %s %s.\r\n", AN(arg), arg);
-	send_to_char(buf2, ch);
+	sprintf(buf, "You don't seem to have %s %s.\r\n", AN(arg), arg);
+	send_to_char(buf, ch);
+	release_buffer(buf);
+	release_buffer(arg);
 	return;
       }
       break;
     case SCMD_USE:
-      sprintf(buf2, "You don't seem to be holding %s %s.\r\n", AN(arg), arg);
-      send_to_char(buf2, ch);
+      sprintf(buf, "You don't seem to be holding %s %s.\r\n", AN(arg), arg);
+      send_to_char(buf, ch);
+      release_buffer(buf);
+      release_buffer(arg);
       return;
       break;
     default:
       log("SYSERR: Unknown subcmd passed to do_use");
+      release_buffer(arg);
+      release_buffer(buf);
       return;
       break;
     }
   }
+  release_buffer(arg);
+
   switch (subcmd) {
   case SCMD_QUAFF:
     if (GET_OBJ_TYPE(mag_item) != ITEM_POTION) {
@@ -629,14 +683,15 @@ ACMD(do_use)
   }
 
   mag_objectmagic(ch, mag_item, buf);
+  release_buffer(buf);
 }
 
 
-
 ACMD(do_wimpy)
 {
   int wimp_lev;
-
+  char	*arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(128);
   one_argument(argument, arg);
 
   if (!*arg) {
@@ -644,9 +699,11 @@ ACMD(do_wimpy)
       sprintf(buf, "Your current wimp level is %d hit points.\r\n",
 	      GET_WIMP_LEV(ch));
       send_to_char(buf, ch);
+      release_buffer(buf);
       return;
     } else {
       send_to_char("At the moment, you're not a wimp.  (sure, sure...)\r\n", ch);
+      release_buffer(buf);
       return;
     }
   }
@@ -671,8 +728,9 @@ ACMD(do_wimpy)
   } else
     send_to_char("Specify at how many hit points you want to wimp out at.  (0 to disable)\r\n", ch);
 
+  release_buffer(buf);
+  release_buffer(arg);
   return;
-
 }
 
 
@@ -718,7 +776,7 @@ ACMD(do_display)
 ACMD(do_gen_write)
 {
   FILE *fl;
-  char *tmp, *filename, buf[MAX_STRING_LENGTH];
+  char *tmp, *filename, *buf;
   struct stat fbuf;
   extern int max_filesize;
   time_t ct;
@@ -752,8 +810,10 @@ ACMD(do_gen_write)
     send_to_char("That must be a mistake...\r\n", ch);
     return;
   }
+  buf = get_buffer(MAX_INPUT_LENGTH);
   sprintf(buf, "%s %s: %s", GET_NAME(ch), CMD_NAME, argument);
   mudlog(buf, CMP, LVL_IMMORT, FALSE);
+  release_buffer(buf);
 
   if (stat(filename, &fbuf) < 0) {
     perror("Error statting file");
diff -uprN -x *.o ../stk/act.social.c ./act.social.c
--- ../stk/act.social.c	Thu Jun 19 00:58:36 1997
+++ ./act.social.c	Sun Aug  3 22:49:09 1997
@@ -87,6 +87,7 @@ ACMD(do_action)
   int act_nr;
   struct social_messg *action;
   struct char_data *vict;
+  char *buf;
 
   if ((act_nr = find_action(cmd)) < 0) {
     send_to_char("That action is not supported.\r\n", ch);
@@ -94,6 +95,7 @@ ACMD(do_action)
   }
   action = &soc_mess_list[act_nr];
 
+  buf = get_buffer(MAX_INPUT_LENGTH);
   if (action->char_found)
     one_argument(argument, buf);
   else
@@ -103,6 +105,7 @@ ACMD(do_action)
     send_to_char(action->char_no_arg, ch);
     send_to_char("\r\n", ch);
     act(action->others_no_arg, action->hide, ch, 0, 0, TO_ROOM);
+    release_buffer(buf);
     return;
   }
   if (!(vict = get_char_room_vis(ch, buf))) {
@@ -122,6 +125,7 @@ ACMD(do_action)
       act(action->vict_found, action->hide, ch, 0, vict, TO_VICT);
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -129,6 +133,7 @@ ACMD(do_action)
 ACMD(do_insult)
 {
   struct char_data *victim;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -137,8 +142,10 @@ ACMD(do_insult)
       send_to_char("Can't hear you!\r\n", ch);
     else {
       if (victim != ch) {
+	char *buf = get_buffer(128);
 	sprintf(buf, "You insult %s.\r\n", GET_NAME(victim));
 	send_to_char(buf, ch);
+	release_buffer(buf);
 
 	switch (number(0, 2)) {
 	case 0:
@@ -171,24 +178,29 @@ ACMD(do_insult)
     }
   } else
     send_to_char("I'm sure you don't want to insult *everybody*...\r\n", ch);
+
+  release_buffer(arg);
 }
 
 
 char *fread_action(FILE * fl, int nr)
 {
-  char buf[MAX_STRING_LENGTH], *rslt;
+  char *buf, *rslt;
 
+  buf = get_buffer(MAX_STRING_LENGTH);
   fgets(buf, MAX_STRING_LENGTH, fl);
   if (feof(fl)) {
     fprintf(stderr, "fread_action - unexpected EOF near action #%d", nr);
+    release_buffer(buf);
     exit(1);
-  }
-  if (*buf == '#')
+  } else if (*buf == '#') {
+    release_buffer(buf);
     return (NULL);
-  else {
+  } else {
     *(buf + strlen(buf) - 1) = '\0';
     CREATE(rslt, char, strlen(buf) + 1);
     strcpy(rslt, buf);
+    release_buffer(buf);
     return (rslt);
   }
 }
@@ -198,12 +210,13 @@ void boot_social_messages(void)
 {
   FILE *fl;
   int nr, i, hide, min_pos, curr_soc = -1;
-  char next_soc[100];
+  char *next_soc = get_buffer(100);
   struct social_messg temp;
   extern struct command_info cmd_info[];
 
   /* open social file */
   if (!(fl = fopen(SOCMESS_FILE, "r"))) {
+    char *buf = get_buffer(128);
     sprintf(buf, "Can't open socials file '%s'", SOCMESS_FILE);
     perror(buf);
     exit(1);
@@ -221,8 +234,10 @@ void boot_social_messages(void)
     if (*next_soc == '$')
       break;
     if ((nr = find_command(next_soc)) < 0) {
+      char *buf = get_buffer(128);
       sprintf(buf, "Unknown social '%s' in social file", next_soc);
       log(buf);
+      release_buffer(buf);
     }
     if (fscanf(fl, " %d %d \n", &hide, &min_pos) != 2) {
       fprintf(stderr, "Format error in social file near social '%s'\n",
@@ -251,6 +266,7 @@ void boot_social_messages(void)
   }
 
   /* close file & set top */
+  release_buffer(next_soc);
   fclose(fl);
   list_top = curr_soc;
 
diff -uprN -x *.o ../stk/act.wizard.c ./act.wizard.c
--- ../stk/act.wizard.c	Thu Jun 19 00:58:36 1997
+++ ./act.wizard.c	Sat Aug 16 22:50:04 1997
@@ -76,6 +76,7 @@ ACMD(do_echo)
   if (!*argument)
     send_to_char("Yes.. but what?\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_INPUT_LENGTH + MAX_NAME_LENGTH + 10);
     if (subcmd == SCMD_EMOTE)
       sprintf(buf, "$n %s", argument);
     else
@@ -85,6 +86,7 @@ ACMD(do_echo)
       send_to_char(OK, ch);
     else
       act(buf, FALSE, ch, 0, 0, TO_CHAR);
+    release_buffer(buf);
   }
 }
 
@@ -92,25 +94,29 @@ ACMD(do_echo)
 ACMD(do_send)
 {
   struct char_data *vict;
+  char *buf = get_buffer(MAX_INPUT_LENGTH),
+	*arg = get_buffer(MAX_INPUT_LENGTH);
 
   half_chop(argument, arg, buf);
 
-  if (!*arg) {
+  if (!*arg) 
     send_to_char("Send what to who?\r\n", ch);
-    return;
-  }
-  if (!(vict = get_char_vis(ch, arg))) {
+  else if (!(vict = get_char_vis(ch, arg)))
     send_to_char(NOPERSON, ch);
-    return;
-  }
-  send_to_char(buf, vict);
-  send_to_char("\r\n", vict);
-  if (PRF_FLAGGED(ch, PRF_NOREPEAT))
-    send_to_char("Sent.\r\n", ch);
   else {
-    sprintf(buf2, "You send '%s' to %s.\r\n", buf, GET_NAME(vict));
-    send_to_char(buf2, ch);
+    send_to_char(buf, vict);
+    send_to_char("\r\n", vict);
+    if (PRF_FLAGGED(ch, PRF_NOREPEAT))
+      send_to_char("Sent.\r\n", ch);
+    else {
+      char *buf2 = get_buffer(SMALL_BUFSIZE);
+      sprintf(buf2, "You send '%s' to %s.\r\n", buf, GET_NAME(vict));
+      send_to_char(buf2, ch);
+      release_buffer(buf2);
+    }
   }
+  release_buffer(arg);
+  release_buffer(buf);
 }
 
 
@@ -122,18 +128,20 @@ sh_int find_target_room(struct char_data
   sh_int location;
   struct char_data *target_mob;
   struct obj_data *target_obj;
-  char roomstr[MAX_INPUT_LENGTH];
+  char *roomstr = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(rawroomstr, roomstr);
 
   if (!*roomstr) {
     send_to_char("You must supply a room number or name.\r\n", ch);
+    release_buffer(roomstr);
     return NOWHERE;
   }
   if (isdigit(*roomstr) && !strchr(roomstr, '.')) {
     tmp = atoi(roomstr);
     if ((location = real_room(tmp)) < 0) {
       send_to_char("No room exists with that number.\r\n", ch);
+      release_buffer(roomstr);
       return NOWHERE;
     }
   } else if ((target_mob = get_char_vis(ch, roomstr)))
@@ -143,10 +151,12 @@ sh_int find_target_room(struct char_data
       location = target_obj->in_room;
     else {
       send_to_char("That object is not available.\r\n", ch);
+      release_buffer(roomstr);
       return NOWHERE;
     }
   } else {
     send_to_char("No such creature or object around.\r\n", ch);
+    release_buffer(roomstr);
     return NOWHERE;
   }
 
@@ -154,19 +164,23 @@ sh_int find_target_room(struct char_data
   if (GET_LEVEL(ch) < LVL_GRGOD) {
     if (ROOM_FLAGGED(location, ROOM_GODROOM)) {
       send_to_char("You are not godly enough to use that room!\r\n", ch);
+      release_buffer(roomstr);
       return NOWHERE;
     }
     if (ROOM_FLAGGED(location, ROOM_PRIVATE) &&
 	world[location].people && world[location].people->next_in_room) {
       send_to_char("There's a private conversation going on in that room.\r\n", ch);
+      release_buffer(roomstr);
       return NOWHERE;
     }
     if (ROOM_FLAGGED(location, ROOM_HOUSE) &&
 	!House_can_enter(ch, world[location].number)) {
       send_to_char("That's private property -- no trespassing!\r\n", ch);
+      release_buffer(roomstr);
       return NOWHERE;
     }
   }
+  release_buffer(roomstr);
   return location;
 }
 
@@ -174,28 +188,36 @@ sh_int find_target_room(struct char_data
 
 ACMD(do_at)
 {
-  char command[MAX_INPUT_LENGTH];
+  char *command = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_INPUT_LENGTH);
   int location, original_loc;
 
   half_chop(argument, buf, command);
   if (!*buf) {
     send_to_char("You must supply a room number or a name.\r\n", ch);
+    release_buffer(command);
+    release_buffer(buf);
     return;
-  }
-
-  if (!*command) {
+  } else if (!*command) {
     send_to_char("What do you want to do there?\r\n", ch);
+    release_buffer(buf);
+    release_buffer(command);
     return;
   }
 
-  if ((location = find_target_room(ch, buf)) < 0)
+  if ((location = find_target_room(ch, buf)) < 0) {
+    release_buffer(command);
+    release_buffer(buf);
     return;
+  }
+  release_buffer(buf);
 
   /* a location has been found. */
   original_loc = ch->in_room;
   char_from_room(ch);
   char_to_room(ch, location);
   command_interpreter(ch, command);
+  release_buffer(command);
 
   /* check if the char is still there */
   if (ch->in_room == location) {
@@ -208,10 +230,13 @@ ACMD(do_at)
 ACMD(do_goto)
 {
   sh_int location;
+  char *buf;
 
   if ((location = find_target_room(ch, argument)) < 0)
     return;
 
+  buf = get_buffer(MAX_STRING_LENGTH);
+
   if (POOFOUT(ch))
     sprintf(buf, "$n %s", POOFOUT(ch));
   else
@@ -228,6 +253,7 @@ ACMD(do_goto)
 
   act(buf, TRUE, ch, 0, 0, TO_ROOM);
   look_at_room(ch, 0);
+  release_buffer(buf);
 }
 
 
@@ -236,6 +262,7 @@ ACMD(do_trans)
 {
   struct descriptor_data *i;
   struct char_data *victim;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
   if (!*buf)
@@ -245,11 +272,9 @@ ACMD(do_trans)
       send_to_char(NOPERSON, ch);
     else if (victim == ch)
       send_to_char("That doesn't make much sense, does it?\r\n", ch);
+    else if ((GET_LEVEL(ch) < GET_LEVEL(victim)) && !IS_NPC(victim))
+      send_to_char("Go transfer someone your own size.\r\n", ch);
     else {
-      if ((GET_LEVEL(ch) < GET_LEVEL(victim)) && !IS_NPC(victim)) {
-	send_to_char("Go transfer someone your own size.\r\n", ch);
-	return;
-      }
       act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM);
       char_from_room(victim);
       char_to_room(victim, ch->in_room);
@@ -260,6 +285,7 @@ ACMD(do_trans)
   } else {			/* Trans All */
     if (GET_LEVEL(ch) < LVL_GRGOD) {
       send_to_char("I think not.\r\n", ch);
+      release_buffer(buf);
       return;
     }
 
@@ -277,6 +303,8 @@ ACMD(do_trans)
       }
     send_to_char(OK, ch);
   }
+
+  release_buffer(buf);
 }
 
 
@@ -285,6 +313,8 @@ ACMD(do_teleport)
 {
   struct char_data *victim;
   sh_int target;
+  char *buf = get_buffer(MAX_INPUT_LENGTH),
+	*buf2 = get_buffer(MAX_INPUT_LENGTH);
 
   two_arguments(argument, buf, buf2);
 
@@ -307,25 +337,30 @@ ACMD(do_teleport)
     act("$n has teleported you!", FALSE, ch, 0, (char *) victim, TO_VICT);
     look_at_room(victim, 0);
   }
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
 
 ACMD(do_vnum)
 {
+  char *buf = get_buffer(MAX_INPUT_LENGTH),
+	*buf2 = get_buffer(MAX_INPUT_LENGTH);
+
   two_arguments(argument, buf, buf2);
 
-  if (!*buf || !*buf2 || (!is_abbrev(buf, "mob") && !is_abbrev(buf, "obj"))) {
+  if (!*buf || !*buf2 || (!is_abbrev(buf, "mob") && !is_abbrev(buf, "obj")))
     send_to_char("Usage: vnum { obj | mob } <name>\r\n", ch);
-    return;
-  }
-  if (is_abbrev(buf, "mob"))
+  else if (is_abbrev(buf, "mob")) {
     if (!vnum_mobile(buf2, ch))
       send_to_char("No mobiles by that name.\r\n", ch);
-
-  if (is_abbrev(buf, "obj"))
+  } else if (is_abbrev(buf, "obj")) {
     if (!vnum_object(buf2, ch))
       send_to_char("No objects by that name.\r\n", ch);
+  }
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
@@ -337,19 +372,21 @@ void do_stat_room(struct char_data * ch)
   int i, found = 0;
   struct obj_data *j = 0;
   struct char_data *k = 0;
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH);
 
   sprintf(buf, "Room name: %s%s%s\r\n", CCCYN(ch, C_NRM), rm->name,
 	  CCNRM(ch, C_NRM));
   send_to_char(buf, ch);
 
-  sprinttype(rm->sector_type, sector_types, buf2);
+  sprinttype(rm->sector_type, sector_types, buf1);
   sprintf(buf, "Zone: [%3d], VNum: [%s%5d%s], RNum: [%5d], Type: %s\r\n",
-	  rm->zone, CCGRN(ch, C_NRM), rm->number, CCNRM(ch, C_NRM), ch->in_room, buf2);
+	  rm->zone, CCGRN(ch, C_NRM), rm->number, CCNRM(ch, C_NRM), ch->in_room, buf1);
   send_to_char(buf, ch);
 
-  sprintbit((long) rm->room_flags, room_bits, buf2);
+  sprintbit((long) rm->room_flags, room_bits, buf1);
   sprintf(buf, "SpecProc: %s, Flags: %s\r\n",
-	  (rm->func == NULL) ? "None" : "Exists", buf2);
+	  (rm->func == NULL) ? "None" : "Exists", buf1);
   send_to_char(buf, ch);
 
   send_to_char("Description:\r\n", ch);
@@ -371,9 +408,9 @@ void do_stat_room(struct char_data * ch)
   for (found = 0, k = rm->people; k; k = k->next_in_room) {
     if (!CAN_SEE(ch, k))
       continue;
-    sprintf(buf2, "%s %s(%s)", found++ ? "," : "", GET_NAME(k),
+    sprintf(buf1, "%s %s(%s)", found++ ? "," : "", GET_NAME(k),
 	    (!IS_NPC(k) ? "PC" : (!IS_MOB(k) ? "NPC" : "MOB")));
-    strcat(buf, buf2);
+    strcat(buf, buf1);
     if (strlen(buf) >= 62) {
       if (k->next_in_room)
 	send_to_char(strcat(buf, ",\r\n"), ch);
@@ -392,8 +429,8 @@ void do_stat_room(struct char_data * ch)
     for (found = 0, j = rm->contents; j; j = j->next_content) {
       if (!CAN_SEE_OBJ(ch, j))
 	continue;
-      sprintf(buf2, "%s %s", found++ ? "," : "", j->short_description);
-      strcat(buf, buf2);
+      sprintf(buf1, "%s %s", found++ ? "," : "", j->short_description);
+      strcat(buf, buf1);
       if (strlen(buf) >= 62) {
 	if (j->next_content)
 	  send_to_char(strcat(buf, ",\r\n"), ch);
@@ -409,16 +446,19 @@ void do_stat_room(struct char_data * ch)
   }
   for (i = 0; i < NUM_OF_DIRS; i++) {
     if (rm->dir_option[i]) {
+      char *buf2;
       if (rm->dir_option[i]->to_room == NOWHERE)
 	sprintf(buf1, " %sNONE%s", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM));
       else
 	sprintf(buf1, "%s%5d%s", CCCYN(ch, C_NRM),
 		world[rm->dir_option[i]->to_room].number, CCNRM(ch, C_NRM));
+      buf2 = get_buffer(MAX_STRING_LENGTH);
       sprintbit(rm->dir_option[i]->exit_info, exit_bits, buf2);
       sprintf(buf, "Exit %s%-5s%s:  To: [%s], Key: [%5d], Keywrd: %s, Type: %s\r\n ",
 	      CCCYN(ch, C_NRM), dirs[i], CCNRM(ch, C_NRM), buf1, rm->dir_option[i]->key,
 	   rm->dir_option[i]->keyword ? rm->dir_option[i]->keyword : "None",
 	      buf2);
+      release_buffer(buf2);
       send_to_char(buf, ch);
       if (rm->dir_option[i]->general_description)
 	strcpy(buf, rm->dir_option[i]->general_description);
@@ -427,6 +467,8 @@ void do_stat_room(struct char_data * ch)
       send_to_char(buf, ch);
     }
   }
+  release_buffer(buf1);
+  release_buffer(buf);
 }
 
 
@@ -436,6 +478,9 @@ void do_stat_object(struct char_data * c
   int i, virtual, found;
   struct obj_data *j2;
   struct extra_descr_data *desc;
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*buf2 = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH);
 
   virtual = GET_OBJ_VNUM(j);
   sprintf(buf, "Name: '%s%s%s', Aliases: %s\r\n", CCYEL(ch, C_NRM),
@@ -607,6 +652,9 @@ void do_stat_character(struct char_data 
   struct follow_type *fol;
   struct affected_type *aff;
   extern struct attack_hit_type attack_hit_text[];
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH),
+	*buf2 = get_buffer(MAX_STRING_LENGTH);
 
   switch (GET_SEX(k)) {
   case SEX_NEUTRAL:    strcpy(buf, "NEUTRAL-SEX");   break;
@@ -790,6 +838,9 @@ void do_stat_character(struct char_data 
       send_to_char(strcat(buf, "\r\n"), ch);
     }
   }
+  release_buffer(buf1);
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
@@ -799,36 +850,33 @@ ACMD(do_stat)
   struct obj_data *object = 0;
   struct char_file_u tmp_store;
   int tmp;
+  char *buf1 = get_buffer(MAX_INPUT_LENGTH),
+	*buf2 = get_buffer(MAX_INPUT_LENGTH);
 
   half_chop(argument, buf1, buf2);
 
-  if (!*buf1) {
+  if (!*buf1)
     send_to_char("Stats on who or what?\r\n", ch);
-    return;
-  } else if (is_abbrev(buf1, "room")) {
+  else if (is_abbrev(buf1, "room"))
     do_stat_room(ch);
-  } else if (is_abbrev(buf1, "mob")) {
+  else if (is_abbrev(buf1, "mob")) {
     if (!*buf2)
       send_to_char("Stats on which mobile?\r\n", ch);
-    else {
-      if ((victim = get_char_vis(ch, buf2)))
-	do_stat_character(ch, victim);
-      else
-	send_to_char("No such mobile around.\r\n", ch);
-    }
+    else if ((victim = get_char_vis(ch, buf2)))
+      do_stat_character(ch, victim);
+    else
+      send_to_char("No such mobile around.\r\n", ch);
   } else if (is_abbrev(buf1, "player")) {
-    if (!*buf2) {
+    if (!*buf2)
       send_to_char("Stats on which player?\r\n", ch);
-    } else {
-      if ((victim = get_player_vis(ch, buf2, 0)))
-	do_stat_character(ch, victim);
-      else
-	send_to_char("No such player around.\r\n", ch);
-    }
+    else if ((victim = get_player_vis(ch, buf2, 0)))
+      do_stat_character(ch, victim);
+    else
+      send_to_char("No such player around.\r\n", ch);
   } else if (is_abbrev(buf1, "file")) {
-    if (!*buf2) {
+    if (!*buf2)
       send_to_char("Stats on which player?\r\n", ch);
-    } else {
+    else {
       CREATE(victim, struct char_data, 1);
       clear_char(victim);
       if (load_char(buf2, &tmp_store) > -1) {
@@ -846,12 +894,10 @@ ACMD(do_stat)
   } else if (is_abbrev(buf1, "object")) {
     if (!*buf2)
       send_to_char("Stats on which object?\r\n", ch);
-    else {
-      if ((object = get_obj_vis(ch, buf2)))
-	do_stat_object(ch, object);
-      else
-	send_to_char("No such object around.\r\n", ch);
-    }
+    else if ((object = get_obj_vis(ch, buf2)))
+      do_stat_object(ch, object);
+    else
+      send_to_char("No such object around.\r\n", ch);
   } else {
     if ((object = get_object_in_equip_vis(ch, buf1, ch->equipment, &tmp)))
       do_stat_object(ch, object);
@@ -868,17 +914,23 @@ ACMD(do_stat)
     else
       send_to_char("Nothing around by that name.\r\n", ch);
   }
+  release_buffer(buf1);
+  release_buffer(buf2);
 }
 
 
 ACMD(do_shutdown)
 {
   extern int circle_shutdown, circle_reboot;
+  char *arg, *buf;
 
   if (subcmd != SCMD_SHUTDOWN) {
     send_to_char("If you want to shut something down, say so!\r\n", ch);
     return;
   }
+
+  buf = get_buffer(SMALL_BUFSIZE);
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg) {
@@ -906,6 +958,9 @@ ACMD(do_shutdown)
     circle_shutdown = 1;
   } else
     send_to_char("Unknown shutdown option.\r\n", ch);
+
+  release_buffer(buf);
+  release_buffer(arg);
 }
 
 
@@ -924,10 +979,12 @@ void stop_snooping(struct char_data * ch
 ACMD(do_snoop)
 {
   struct char_data *victim, *tch;
+  char *arg;
 
   if (!ch->desc)
     return;
 
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
 
   if (!*arg)
@@ -943,23 +1000,21 @@ ACMD(do_snoop)
   else if (victim->desc->snooping == ch->desc)
     send_to_char("Don't be stupid.\r\n", ch);
   else {
-    if (victim->desc->original)
-      tch = victim->desc->original;
-    else
-      tch = victim;
+    tch = (victim->desc->original ? victim->desc->original : victim);
 
-    if (GET_LEVEL(tch) >= GET_LEVEL(ch)) {
+    if (GET_LEVEL(tch) >= GET_LEVEL(ch))
       send_to_char("You can't.\r\n", ch);
-      return;
-    }
-    send_to_char(OK, ch);
+    else {
+      send_to_char(OK, ch);
 
-    if (ch->desc->snooping)
-      ch->desc->snooping->snoop_by = NULL;
+      if (ch->desc->snooping)
+        ch->desc->snooping->snoop_by = NULL;
 
-    ch->desc->snooping = victim->desc;
-    victim->desc->snoop_by = ch->desc;
+      ch->desc->snooping = victim->desc;
+      victim->desc->snoop_by = ch->desc;
+    }
   }
+  release_buffer(arg);
 }
 
 
@@ -967,6 +1022,7 @@ ACMD(do_snoop)
 ACMD(do_switch)
 {
   struct char_data *victim;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -991,6 +1047,7 @@ ACMD(do_switch)
     victim->desc = ch->desc;
     ch->desc = NULL;
   }
+  release_buffer(arg);
 }
 
 
@@ -1019,41 +1076,42 @@ ACMD(do_load)
   struct char_data *mob;
   struct obj_data *obj;
   int number, r_num;
+  char 	*buf = get_buffer(MAX_INPUT_LENGTH),
+	*buf2 = get_buffer(MAX_INPUT_LENGTH);
 
   two_arguments(argument, buf, buf2);
 
-  if (!*buf || !*buf2 || !isdigit(*buf2)) {
+  if (!*buf || !*buf2 || !isdigit(*buf2))
     send_to_char("Usage: load { obj | mob } <number>\r\n", ch);
-    return;
-  }
-  if ((number = atoi(buf2)) < 0) {
+  else if ((number = atoi(buf2)) < 0)
     send_to_char("A NEGATIVE number??\r\n", ch);
-    return;
-  }
-  if (is_abbrev(buf, "mob")) {
-    if ((r_num = real_mobile(number)) < 0) {
+  else if (is_abbrev(buf, "mob")) {
+    if ((r_num = real_mobile(number)) < 0)
       send_to_char("There is no monster with that number.\r\n", ch);
-      return;
-    }
-    mob = read_mobile(r_num, REAL);
-    char_to_room(mob, ch->in_room);
+    else {
+      mob = read_mobile(r_num, REAL);
+      char_to_room(mob, ch->in_room);
 
-    act("$n makes a quaint, magical gesture with one hand.", TRUE, ch,
-	0, 0, TO_ROOM);
-    act("$n has created $N!", FALSE, ch, 0, mob, TO_ROOM);
-    act("You create $N.", FALSE, ch, 0, mob, TO_CHAR);
+      act("$n makes a quaint, magical gesture with one hand.", TRUE, ch,
+	  0, 0, TO_ROOM);
+      act("$n has created $N!", FALSE, ch, 0, mob, TO_ROOM);
+      act("You create $N.", FALSE, ch, 0, mob, TO_CHAR);
+    }
   } else if (is_abbrev(buf, "obj")) {
-    if ((r_num = real_object(number)) < 0) {
+    if ((r_num = real_object(number)) < 0)
       send_to_char("There is no object with that number.\r\n", ch);
-      return;
+    else {
+      obj = read_object(r_num, REAL);
+      obj_to_room(obj, ch->in_room);
+      act("$n makes a strange magical gesture.", TRUE, ch, 0, 0, TO_ROOM);
+      act("$n has created $p!", FALSE, ch, obj, 0, TO_ROOM);
+      act("You create $p.", FALSE, ch, obj, 0, TO_CHAR);
     }
-    obj = read_object(r_num, REAL);
-    obj_to_room(obj, ch->in_room);
-    act("$n makes a strange magical gesture.", TRUE, ch, 0, 0, TO_ROOM);
-    act("$n has created $p!", FALSE, ch, obj, 0, TO_ROOM);
-    act("You create $p.", FALSE, ch, obj, 0, TO_CHAR);
   } else
     send_to_char("That'll have to be either 'obj' or 'mob'.\r\n", ch);
+
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
@@ -1063,36 +1121,37 @@ ACMD(do_vstat)
   struct char_data *mob;
   struct obj_data *obj;
   int number, r_num;
+  char	*buf = get_buffer(MAX_INPUT_LENGTH),
+	*buf2 = get_buffer(MAX_INPUT_LENGTH);
 
   two_arguments(argument, buf, buf2);
 
-  if (!*buf || !*buf2 || !isdigit(*buf2)) {
+  if (!*buf || !*buf2 || !isdigit(*buf2))
     send_to_char("Usage: vstat { obj | mob } <number>\r\n", ch);
-    return;
-  }
-  if ((number = atoi(buf2)) < 0) {
+  else if ((number = atoi(buf2)) < 0)
     send_to_char("A NEGATIVE number??\r\n", ch);
-    return;
-  }
-  if (is_abbrev(buf, "mob")) {
-    if ((r_num = real_mobile(number)) < 0) {
+  else if (is_abbrev(buf, "mob")) {
+    if ((r_num = real_mobile(number)) < 0)
       send_to_char("There is no monster with that number.\r\n", ch);
-      return;
+    else {
+      mob = read_mobile(r_num, REAL);
+      char_to_room(mob, 0);
+      do_stat_character(ch, mob);
+      extract_char(mob);
     }
-    mob = read_mobile(r_num, REAL);
-    char_to_room(mob, 0);
-    do_stat_character(ch, mob);
-    extract_char(mob);
   } else if (is_abbrev(buf, "obj")) {
-    if ((r_num = real_object(number)) < 0) {
+    if ((r_num = real_object(number)) < 0)
       send_to_char("There is no object with that number.\r\n", ch);
-      return;
+    else {
+      obj = read_object(r_num, REAL);
+      do_stat_object(ch, obj);
+      extract_obj(obj);
     }
-    obj = read_object(r_num, REAL);
-    do_stat_object(ch, obj);
-    extract_obj(obj);
   } else
     send_to_char("That'll have to be either 'obj' or 'mob'.\r\n", ch);
+
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
@@ -1103,14 +1162,15 @@ ACMD(do_purge)
 {
   struct char_data *vict, *next_v;
   struct obj_data *obj, *next_o;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
-
   if (*buf) {			/* argument supplied. destroy single object
 				 * or char */
     if ((vict = get_char_room_vis(ch, buf))) {
       if (!IS_NPC(vict) && (GET_LEVEL(ch) <= GET_LEVEL(vict))) {
 	send_to_char("Fuuuuuuuuu!\r\n", ch);
+	release_buffer(buf);
 	return;
       }
       act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT);
@@ -1129,6 +1189,7 @@ ACMD(do_purge)
       extract_obj(obj);
     } else {
       send_to_char("Nothing here by that name.\r\n", ch);
+      release_buffer(buf);
       return;
     }
 
@@ -1149,6 +1210,7 @@ ACMD(do_purge)
       extract_obj(obj);
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -1156,7 +1218,8 @@ ACMD(do_purge)
 ACMD(do_advance)
 {
   struct char_data *victim;
-  char *name = arg, *level = buf2;
+  char	*name = get_buffer(MAX_STRING_LENGTH),
+	*level = get_buffer(MAX_STRING_LENGTH);
   int newlevel, oldlevel;
   void do_start(struct char_data *ch);
 
@@ -1164,70 +1227,59 @@ ACMD(do_advance)
 
   two_arguments(argument, name, level);
 
-  if (*name) {
-    if (!(victim = get_char_vis(ch, name))) {
-      send_to_char("That player is not here.\r\n", ch);
-      return;
-    }
-  } else {
+  if (!*name)
     send_to_char("Advance who?\r\n", ch);
-    return;
-  }
-
-  if (GET_LEVEL(ch) <= GET_LEVEL(victim)) {
+  else if (!(victim = get_char_vis(ch, name)))
+    send_to_char("That player is not here.\r\n", ch);
+  else if (GET_LEVEL(ch) <= GET_LEVEL(victim))
     send_to_char("Maybe that's not such a great idea.\r\n", ch);
-    return;
-  }
-  if (IS_NPC(victim)) {
+  else if (IS_NPC(victim))
     send_to_char("NO!  Not on NPC's.\r\n", ch);
-    return;
-  }
-  if (!*level || (newlevel = atoi(level)) <= 0) {
+  else if (!*level || (newlevel = atoi(level)) <= 0)
     send_to_char("That's not a level!\r\n", ch);
-    return;
-  }
-  if (newlevel > LVL_IMPL) {
+  else if (newlevel > LVL_IMPL) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "%d is the highest possible level.\r\n", LVL_IMPL);
     send_to_char(buf, ch);
-    return;
-  }
-  if (newlevel > GET_LEVEL(ch)) {
+    release_buffer(buf);
+  } else if (newlevel > GET_LEVEL(ch))
     send_to_char("Yeah, right.\r\n", ch);
-    return;
-  }
-  if (newlevel == GET_LEVEL(victim)) {
+  else if (newlevel == GET_LEVEL(victim))
     send_to_char("They are already at that level.\r\n", ch);
-    return;
-  }
-  oldlevel = GET_LEVEL(victim);
-  if (newlevel < GET_LEVEL(victim)) {
-    do_start(victim);
-    GET_LEVEL(victim) = newlevel;
-    send_to_char("You are momentarily enveloped by darkness!\r\n"
-		 "You feel somewhat diminished.\r\n", ch);
-  } else {
-    act("$n makes some strange gestures.\r\n"
-	"A strange feeling comes upon you,\r\n"
-	"Like a giant hand, light comes down\r\n"
-	"from above, grabbing your body, that\r\n"
-	"begins to pulse with colored lights\r\n"
-	"from inside.\r\n\r\n"
-	"Your head seems to be filled with demons\r\n"
-	"from another plane as your body dissolves\r\n"
-	"to the elements of time and space itself.\r\n"
-	"Suddenly a silent explosion of light\r\n"
-	"snaps you back to reality.\r\n\r\n"
-	"You feel slightly different.", FALSE, ch, 0, victim, TO_VICT);
-  }
+  else {
+    char *buf;
 
-  send_to_char(OK, ch);
+    oldlevel = GET_LEVEL(victim);
+    if (newlevel < GET_LEVEL(victim)) {
+      do_start(victim);
+      GET_LEVEL(victim) = newlevel;
+      send_to_char("You are momentarily enveloped by darkness!\r\n"
+		   "You feel somewhat diminished.\r\n", ch);
+    } else
+      act("$n makes some strange gestures.\r\n"
+	  "A strange feeling comes upon you,\r\n"
+	  "Like a giant hand, light comes down\r\n"
+	  "from above, grabbing your body, that\r\n"
+	  "begins to pulse with colored lights\r\n"
+	  "from inside.\r\n\r\n"
+	  "Your head seems to be filled with demons\r\n"
+	  "from another plane as your body dissolves\r\n"
+	  "to the elements of time and space itself.\r\n"
+	  "Suddenly a silent explosion of light\r\n"
+	  "snaps you back to reality.\r\n\r\n"
+	  "You feel slightly different.", FALSE, ch, 0, victim, TO_VICT);
+    send_to_char(OK, ch);
 
-  sprintf(buf, "(GC) %s has advanced %s to level %d (from %d)",
+    buf = get_buffer(SMALL_BUFSIZE);
+    sprintf(buf, "(GC) %s has advanced %s to level %d (from %d)",
 	  GET_NAME(ch), GET_NAME(victim), newlevel, oldlevel);
-  log(buf);
-  gain_exp_regardless(victim,
+    log(buf);
+    gain_exp_regardless(victim,
 	 (titles[(int) GET_CLASS(victim)][newlevel].exp) - GET_EXP(victim));
-  save_char(victim, NOWHERE);
+    save_char(victim, NOWHERE);
+  }
+  release_buffer(name);
+  release_buffer(level);
 }
 
 
@@ -1236,6 +1288,7 @@ ACMD(do_restore)
 {
   struct char_data *vict;
   int i;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, buf);
   if (!*buf)
@@ -1266,6 +1319,7 @@ ACMD(do_restore)
     send_to_char(OK, ch);
     act("You have been fully healed by $N!", FALSE, vict, 0, ch, TO_CHAR);
   }
+  release_buffer(buf);
 }
 
 
@@ -1287,6 +1341,7 @@ void perform_immort_vis(struct char_data
 void perform_immort_invis(struct char_data *ch, int level)
 {
   struct char_data *tch;
+  char *buf;
 
   if (IS_NPC(ch))
     return;
@@ -1303,20 +1358,24 @@ void perform_immort_invis(struct char_da
   }
 
   GET_INVIS_LEV(ch) = level;
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "Your invisibility level is %d.\r\n", level);
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
   
 
 ACMD(do_invis)
 {
   int level;
+  char *arg;
 
   if (IS_NPC(ch)) {
     send_to_char("You can't do that!\r\n", ch);
     return;
   }
 
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
   if (!*arg) {
     if (GET_INVIS_LEV(ch) > 0)
@@ -1332,6 +1391,7 @@ ACMD(do_invis)
     else
       perform_immort_invis(ch, level);
   }
+  release_buffer(arg);
 }
 
 
@@ -1344,6 +1404,7 @@ ACMD(do_gecho)
   if (!*argument)
     send_to_char("That must be a mistake...\r\n", ch);
   else {
+    char *buf = get_buffer(MAX_INPUT_LENGTH);
     sprintf(buf, "%s\r\n", argument);
     for (pt = descriptor_list; pt; pt = pt->next)
       if (!pt->connected && pt->character && pt->character != ch)
@@ -1352,6 +1413,7 @@ ACMD(do_gecho)
       send_to_char(OK, ch);
     else
       send_to_char(buf, ch);
+    release_buffer(buf);
   }
 }
 
@@ -1385,12 +1447,15 @@ ACMD(do_dc)
 {
   struct descriptor_data *d;
   int num_to_dc;
+  char *buf, *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
   if (!(num_to_dc = atoi(arg))) {
     send_to_char("Usage: DC <connection number> (type USERS for a list)\r\n", ch);
+    release_buffer(arg);
     return;
   }
+  release_buffer(arg);
   for (d = descriptor_list; d && d->desc_num != num_to_dc; d = d->next);
 
   if (!d) {
@@ -1402,10 +1467,12 @@ ACMD(do_dc)
     return;
   }
   close_socket(d);
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "Connection #%d closed.\r\n", num_to_dc);
   send_to_char(buf, ch);
   sprintf(buf, "(GC) Connection closed by %s.", GET_NAME(ch));
   log(buf);
+  release_buffer(buf);
 }
 
 
@@ -1414,12 +1481,14 @@ ACMD(do_wizlock)
 {
   int value;
   char *when;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
-  one_argument(argument, arg);
-  if (*arg) {
-    value = atoi(arg);
+  one_argument(argument, buf);
+  if (*buf) {
+    value = atoi(buf);
     if (value < 0 || value > GET_LEVEL(ch)) {
       send_to_char("Invalid wizlock value.\r\n", ch);
+      release_buffer(buf);
       return;
     }
     restrict = value;
@@ -1440,6 +1509,7 @@ ACMD(do_wizlock)
     break;
   }
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -1449,6 +1519,7 @@ ACMD(do_date)
   time_t mytime;
   int d, h, m;
   extern time_t boot_time;
+  char *buf = get_buffer(SMALL_BUFSIZE);
 
   if (subcmd == SCMD_DATE)
     mytime = time(0);
@@ -1471,6 +1542,7 @@ ACMD(do_date)
   }
 
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -1479,25 +1551,32 @@ ACMD(do_last)
 {
   struct char_file_u chdata;
   extern char *class_abbrevs[];
+  char *arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf;
 
   one_argument(argument, arg);
   if (!*arg) {
     send_to_char("For whom do you wish to search?\r\n", ch);
+    release_buffer(arg);
     return;
   }
   if (load_char(arg, &chdata) < 0) {
     send_to_char("There is no such player.\r\n", ch);
+    release_buffer(arg);
     return;
   }
+  release_buffer(arg);
   if ((chdata.level > GET_LEVEL(ch)) && (GET_LEVEL(ch) < LVL_IMPL)) {
     send_to_char("You are not sufficiently godly for that!\r\n", ch);
     return;
   }
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "[%5ld] [%2d %s] %-12s : %-18s : %-20s\r\n",
 	  chdata.char_specials_saved.idnum, (int) chdata.level,
 	  class_abbrevs[(int) chdata.class], chdata.name, chdata.host,
 	  ctime(&chdata.last_logon));
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -1505,7 +1584,10 @@ ACMD(do_force)
 {
   struct descriptor_data *i, *next_desc;
   struct char_data *vict, *next_force;
-  char to_force[MAX_INPUT_LENGTH + 2];
+  char *to_force = get_buffer(MAX_INPUT_LENGTH + 2),
+	*arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf1 = get_buffer(SMALL_BUFSIZE),
+	*buf = get_buffer(SMALL_BUFSIZE);
 
   half_chop(argument, arg, to_force);
 
@@ -1551,6 +1633,9 @@ ACMD(do_force)
       command_interpreter(vict, to_force);
     }
   }
+  release_buffer(to_force);
+  release_buffer(buf1);
+  release_buffer(arg);
 }
 
 
@@ -1558,8 +1643,7 @@ ACMD(do_force)
 ACMD(do_wiznet)
 {
   struct descriptor_data *d;
-  char emote = FALSE;
-  char any = FALSE;
+  char emote = FALSE, any = FALSE, *buf1, *buf2;
   int level = LVL_IMMORT;
 
   skip_spaces(&argument);
@@ -1570,16 +1654,19 @@ ACMD(do_wiznet)
 		 "       wiznet @<level> *<emotetext> | wiz @\r\n", ch);
     return;
   }
+  buf1 = get_buffer(MAX_STRING_LENGTH);
+
   switch (*argument) {
   case '*':
     emote = TRUE;
   case '#':
     one_argument(argument + 1, buf1);
     if (is_number(buf1)) {
-      half_chop(argument+1, buf1, argument);
+      half_chop(argument + 1, buf1, argument);
       level = MAX(atoi(buf1), LVL_IMMORT);
       if (level > GET_LEVEL(ch)) {
 	send_to_char("You can't wizline above your own level.\r\n", ch);
+	release_buffer(buf1);
 	return;
       }
     } else if (emote)
@@ -1617,6 +1704,7 @@ ACMD(do_wiznet)
       }
     }
     send_to_char(buf1, ch);
+    release_buffer(buf1);
     return;
     break;
   case '\\':
@@ -1627,14 +1715,17 @@ ACMD(do_wiznet)
   }
   if (PRF_FLAGGED(ch, PRF_NOWIZ)) {
     send_to_char("You are offline!\r\n", ch);
+    release_buffer(buf1);
     return;
   }
   skip_spaces(&argument);
 
   if (!*argument) {
     send_to_char("Don't bother the gods like that!\r\n", ch);
+    release_buffer(buf1);
     return;
   }
+  buf2 = get_buffer(MAX_STRING_LENGTH);
   if (level > LVL_IMMORT) {
     sprintf(buf1, "%s: <%d> %s%s\r\n", GET_NAME(ch), level,
 	    emote ? "<--- " : "", argument);
@@ -1662,6 +1753,9 @@ ACMD(do_wiznet)
 
   if (PRF_FLAGGED(ch, PRF_NOREPEAT))
     send_to_char(OK, ch);
+
+  release_buffer(buf1);
+  release_buffer(buf2);
 }
 
 
@@ -1669,20 +1763,23 @@ ACMD(do_wiznet)
 ACMD(do_zreset)
 {
   void reset_zone(int zone);
-
+  char *arg = get_buffer(MAX_INPUT_LENGTH), *buf;
   int i, j;
 
   one_argument(argument, arg);
   if (!*arg) {
     send_to_char("You must specify a zone.\r\n", ch);
+    release_buffer(arg);
     return;
   }
+  buf = get_buffer(SMALL_BUFSIZE);
   if (*arg == '*') {
     for (i = 0; i <= top_of_zone_table; i++)
       reset_zone(i);
     send_to_char("Reset world.\r\n", ch);
     sprintf(buf, "(GC) %s reset entire world.", GET_NAME(ch));
     mudlog(buf, NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE);
+    release_buffer(buf);
     return;
   } else if (*arg == '.')
     i = world[ch->in_room].zone;
@@ -1701,6 +1798,7 @@ ACMD(do_zreset)
     mudlog(buf, NRM, MAX(LVL_GRGOD, GET_INVIS_LEV(ch)), TRUE);
   } else
     send_to_char("Invalid zone number.\r\n", ch);
+  release_buffer(buf);
 }
 
 
@@ -1713,6 +1811,7 @@ ACMD(do_wizutil)
   struct char_data *vict;
   long result;
   void roll_real_abils(struct char_data *ch);
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -1729,47 +1828,49 @@ ACMD(do_wizutil)
     case SCMD_REROLL:
       send_to_char("Rerolled...\r\n", ch);
       roll_real_abils(vict);
-      sprintf(buf, "(GC) %s has rerolled %s.", GET_NAME(ch), GET_NAME(vict));
-      log(buf);
-      sprintf(buf, "New stats: Str %d/%d, Int %d, Wis %d, Dex %d, Con %d, Cha %d\r\n",
+      sprintf(arg, "(GC) %s has rerolled %s.", GET_NAME(ch), GET_NAME(vict));
+      log(arg);
+      sprintf(arg, "New stats: Str %d/%d, Int %d, Wis %d, Dex %d, Con %d, Cha %d\r\n",
 	      GET_STR(vict), GET_ADD(vict), GET_INT(vict), GET_WIS(vict),
 	      GET_DEX(vict), GET_CON(vict), GET_CHA(vict));
-      send_to_char(buf, ch);
+      send_to_char(arg, ch);
       break;
     case SCMD_PARDON:
       if (!PLR_FLAGGED(vict, PLR_THIEF | PLR_KILLER)) {
 	send_to_char("Your victim is not flagged.\r\n", ch);
+	release_buffer(arg);
 	return;
       }
       REMOVE_BIT(PLR_FLAGS(vict), PLR_THIEF | PLR_KILLER);
       send_to_char("Pardoned.\r\n", ch);
       send_to_char("You have been pardoned by the Gods!\r\n", vict);
-      sprintf(buf, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch));
-      mudlog(buf, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+      sprintf(arg, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch));
+      mudlog(arg, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
       break;
     case SCMD_NOTITLE:
       result = PLR_TOG_CHK(vict, PLR_NOTITLE);
-      sprintf(buf, "(GC) Notitle %s for %s by %s.", ONOFF(result),
+      sprintf(arg, "(GC) Notitle %s for %s by %s.", ONOFF(result),
 	      GET_NAME(vict), GET_NAME(ch));
-      mudlog(buf, NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
-      strcat(buf, "\r\n");
-      send_to_char(buf, ch);
+      mudlog(arg, NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+      strcat(arg, "\r\n");
+      send_to_char(arg, ch);
       break;
     case SCMD_SQUELCH:
       result = PLR_TOG_CHK(vict, PLR_NOSHOUT);
-      sprintf(buf, "(GC) Squelch %s for %s by %s.", ONOFF(result),
+      sprintf(arg, "(GC) Squelch %s for %s by %s.", ONOFF(result),
 	      GET_NAME(vict), GET_NAME(ch));
-      mudlog(buf, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
-      strcat(buf, "\r\n");
-      send_to_char(buf, ch);
+      mudlog(arg, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+      strcat(arg, "\r\n");
+      send_to_char(arg, ch);
       break;
     case SCMD_FREEZE:
       if (ch == vict) {
 	send_to_char("Oh, yeah, THAT'S real smart...\r\n", ch);
+	release_buffer(arg);
 	return;
-      }
-      if (PLR_FLAGGED(vict, PLR_FROZEN)) {
+      } else if (PLR_FLAGGED(vict, PLR_FROZEN)) {
 	send_to_char("Your victim is already pretty cold.\r\n", ch);
+	release_buffer(arg);
 	return;
       }
       SET_BIT(PLR_FLAGS(vict), PLR_FROZEN);
@@ -1777,22 +1878,23 @@ ACMD(do_wizutil)
       send_to_char("A bitter wind suddenly rises and drains every erg of heat from your body!\r\nYou feel frozen!\r\n", vict);
       send_to_char("Frozen.\r\n", ch);
       act("A sudden cold wind conjured from nowhere freezes $n!", FALSE, vict, 0, 0, TO_ROOM);
-      sprintf(buf, "(GC) %s frozen by %s.", GET_NAME(vict), GET_NAME(ch));
-      mudlog(buf, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+      sprintf(arg, "(GC) %s frozen by %s.", GET_NAME(vict), GET_NAME(ch));
+      mudlog(arg, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
       break;
     case SCMD_THAW:
       if (!PLR_FLAGGED(vict, PLR_FROZEN)) {
 	send_to_char("Sorry, your victim is not morbidly encased in ice at the moment.\r\n", ch);
+	release_buffer(arg);
 	return;
-      }
-      if (GET_FREEZE_LEV(vict) > GET_LEVEL(ch)) {
-	sprintf(buf, "Sorry, a level %d God froze %s... you can't unfreeze %s.\r\n",
+      } else if (GET_FREEZE_LEV(vict) > GET_LEVEL(ch)) {
+	sprintf(arg, "Sorry, a level %d God froze %s... you can't unfreeze %s.\r\n",
 	   GET_FREEZE_LEV(vict), GET_NAME(vict), HMHR(vict));
-	send_to_char(buf, ch);
+	send_to_char(arg, ch);
+	release_buffer(arg);
 	return;
       }
-      sprintf(buf, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch));
-      mudlog(buf, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+      sprintf(arg, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch));
+      mudlog(arg, BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
       REMOVE_BIT(PLR_FLAGS(vict), PLR_FROZEN);
       send_to_char("A fireball suddenly explodes in front of you, melting the ice!\r\nYou feel thawed.\r\n", vict);
       send_to_char("Thawed.\r\n", ch);
@@ -1807,6 +1909,7 @@ ACMD(do_wizutil)
 	send_to_char("All spells removed.\r\n", ch);
       } else {
 	send_to_char("Your victim does not have any affections!\r\n", ch);
+	release_buffer(arg);
 	return;
       }
       break;
@@ -1816,6 +1919,7 @@ ACMD(do_wizutil)
     }
     save_char(vict, NOWHERE);
   }
+  release_buffer(arg);
 }
 
 
@@ -1838,12 +1942,12 @@ ACMD(do_show)
   char self = 0;
   struct char_data *vict;
   struct obj_data *obj;
-  char field[MAX_INPUT_LENGTH], value[MAX_INPUT_LENGTH], birth[80];
   extern char *class_abbrevs[];
   extern char *genders[];
   extern int buf_switches, buf_largecount, buf_overflows;
   void show_shops(struct char_data * ch, char *value);
   void hcontrol_list_houses(struct char_data *ch);
+  char *field, *value, *birth, *arg, *buf;
 
   struct show_struct {
     char *cmd;
@@ -1859,21 +1963,27 @@ ACMD(do_show)
     { "godrooms",	LVL_GOD },
     { "shops",		LVL_IMMORT },
     { "houses",		LVL_GOD },
+    { "buffers",	LVL_GOD },
     { "\n", 0 }
   };
 
   skip_spaces(&argument);
 
   if (!*argument) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     strcpy(buf, "Show options:\r\n");
     for (j = 0, i = 1; fields[i].level; i++)
       if (fields[i].level <= GET_LEVEL(ch))
 	sprintf(buf, "%s%-15s%s", buf, fields[i].cmd, (!(++j % 5) ? "\r\n" : ""));
     strcat(buf, "\r\n");
     send_to_char(buf, ch);
+    release_buffer(buf);
     return;
   }
 
+  arg = get_buffer(MAX_INPUT_LENGTH);
+  field = get_buffer(MAX_INPUT_LENGTH);
+  value = get_buffer(MAX_INPUT_LENGTH);
   strcpy(arg, two_arguments(argument, field, value));
 
   for (l = 0; *(fields[l].cmd) != '\n'; l++)
@@ -1882,11 +1992,15 @@ ACMD(do_show)
 
   if (GET_LEVEL(ch) < fields[l].level) {
     send_to_char("You are not godly enough for that!\r\n", ch);
+    release_buffer(field);
+    release_buffer(value);
+    release_buffer(arg);
     return;
   }
   if (!strcmp(value, "."))
     self = 1;
-  buf[0] = '\0';
+
+  buf = get_buffer(MAX_STRING_LENGTH); /* Automatically NULL. */
   switch (l) {
   case 1:			/* zone */
     /* tightened up by JE 4/6/93 */
@@ -1898,7 +2012,7 @@ ACMD(do_show)
 	print_zone_to_buf(buf, i);
       else {
 	send_to_char("That is not a valid zone.\r\n", ch);
-	return;
+	break;
       }
     } else
       for (i = 0; i <= top_of_zone_table; i++)
@@ -1908,12 +2022,12 @@ ACMD(do_show)
   case 2:			/* player */
     if (!*value) {
       send_to_char("A name would help.\r\n", ch);
-      return;
+      break;
     }
 
     if (load_char(value, &vbuf) < 0) {
       send_to_char("There is no such player.\r\n", ch);
-      return;
+      break;
     }
     sprintf(buf, "Player: %-12s (%s) [%2d %s]\r\n", vbuf.name,
       genders[(int) vbuf.sex], vbuf.level, class_abbrevs[(int) vbuf.class]);
@@ -1922,12 +2036,14 @@ ACMD(do_show)
 	    buf, vbuf.points.gold, vbuf.points.bank_gold, vbuf.points.exp,
 	    vbuf.char_specials_saved.alignment,
 	    vbuf.player_specials_saved.spells_to_learn);
+    birth = get_buffer(80);
     strcpy(birth, ctime(&vbuf.birth));
     sprintf(buf,
 	    "%sStarted: %-20.16s  Last: %-20.16s  Played: %3dh %2dm\r\n",
 	    buf, birth, ctime(&vbuf.last_logon), (int) (vbuf.played / 3600),
 	    (int) (vbuf.played / 60 % 60));
     send_to_char(buf, ch);
+    release_buffer(birth);
     break;
   case 3:
     Crash_listrent(ch, value);
@@ -1994,10 +2110,17 @@ ACMD(do_show)
   case 9:
     hcontrol_list_houses(ch);
     break;
+  case 10:
+    show_buffers(ch);
+    break;
   default:
     send_to_char("Sorry, I don't understand that.\r\n", ch);
     break;
   }
+  release_buffer(field);
+  release_buffer(value);
+  release_buffer(arg);
+  release_buffer(buf);
 }
 
 
@@ -2015,12 +2138,18 @@ ACMD(do_show)
 
 #define RANGE(low, high) (value = MAX((low), MIN((high), (value))))
 
+/*
+ * XXX: This uses release_and_return;
+ */
 ACMD(do_set)
 {
   int i, l;
   struct char_data *vict = NULL, *cbuf = NULL;
   struct char_file_u tmp_store;
-  char field[MAX_INPUT_LENGTH], name[MAX_INPUT_LENGTH], val_arg[MAX_INPUT_LENGTH];
+  char *field = get_buffer(MAX_INPUT_LENGTH),
+	*name = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_INPUT_LENGTH),
+	*val_arg = get_buffer(MAX_INPUT_LENGTH);
   int on = 0, off = 0, value = 0;
   char is_file = 0, is_mob = 0, is_player = 0;
   int player_i = 0;
@@ -2099,18 +2228,18 @@ ACMD(do_set)
 
   if (!*name || !*field) {
     send_to_char("Usage: set <victim> <field> <value>\r\n", ch);
-    return;
+    release_and_return;
   }
   if (!is_file) {
     if (is_player) {
       if (!(vict = get_player_vis(ch, name, 0))) {
 	send_to_char("There is no such player.\r\n", ch);
-	return;
+	release_and_return;
       }
     } else {
       if (!(vict = get_char_vis(ch, name))) {
 	send_to_char("There is no such creature.\r\n", ch);
-	return;
+	release_and_return;
       }
     }
   } else if (is_file) {
@@ -2121,19 +2250,19 @@ ACMD(do_set)
       if (GET_LEVEL(cbuf) >= GET_LEVEL(ch)) {
 	free_char(cbuf);
 	send_to_char("Sorry, you can't do that.\r\n", ch);
-	return;
+	release_and_return;
       }
       vict = cbuf;
     } else {
       free(cbuf);
       send_to_char("There is no such player.\r\n", ch);
-      return;
+      release_and_return;
     }
   }
   if (GET_LEVEL(ch) != LVL_IMPL) {
     if (!IS_NPC(vict) && GET_LEVEL(ch) <= GET_LEVEL(vict) && vict != ch) {
       send_to_char("Maybe that's not such a great idea...\r\n", ch);
-      return;
+      release_and_return;
     }
   }
   for (l = 0; *(fields[l].cmd) != '\n'; l++)
@@ -2142,14 +2271,14 @@ ACMD(do_set)
 
   if (GET_LEVEL(ch) < fields[l].level) {
     send_to_char("You are not godly enough for that!\r\n", ch);
-    return;
+    release_and_return;
   }
   if (IS_NPC(vict) && !(fields[l].pcnpc & NPC)) {
     send_to_char("You can't do that to a beast!\r\n", ch);
-    return;
+    release_and_return;
   } else if (!IS_NPC(vict) && !(fields[l].pcnpc & PC)) {
     send_to_char("That can only be done to a beast!\r\n", ch);
-    return;
+    release_and_return;
   }
   if (fields[l].type == BINARY) {
     if (!strcmp(val_arg, "on") || !strcmp(val_arg, "yes"))
@@ -2158,7 +2287,7 @@ ACMD(do_set)
       off = 1;
     if (!(on || off)) {
       send_to_char("Value must be on or off.\r\n", ch);
-      return;
+      release_and_return;
     }
   } else if (fields[l].type == NUMBER) {
     value = atoi(val_arg);
@@ -2264,7 +2393,7 @@ ACMD(do_set)
       vict->player.sex = SEX_NEUTRAL;
     else {
       send_to_char("Must be 'male', 'female', or 'neutral'.\r\n", ch);
-      return;
+      break;
     }
     break;
   case 18:
@@ -2291,21 +2420,21 @@ ACMD(do_set)
   case 24:
     if (GET_LEVEL(ch) < LVL_IMPL && ch != vict) {
       send_to_char("You aren't godly enough for that!\r\n", ch);
-      return;
+      break;
     }
     GET_INVIS_LEV(vict) = RANGE(0, GET_LEVEL(vict));
     break;
   case 25:
     if (GET_LEVEL(ch) < LVL_IMPL && ch != vict) {
       send_to_char("You aren't godly enough for that!\r\n", ch);
-      return;
+      break;
     }
     SET_OR_REMOVE(PRF_FLAGS(vict), PRF_NOHASSLE);
     break;
   case 26:
     if (ch == vict) {
       send_to_char("Better not -- could be a long winter!\r\n", ch);
-      return;
+      break;
     }
     SET_OR_REMOVE(PLR_FLAGS(vict), PLR_FROZEN);
     break;
@@ -2327,7 +2456,7 @@ ACMD(do_set)
 	      value);
     } else {
       send_to_char("Must be 'off' or a value from 0 to 24.\r\n", ch);
-      return;
+      break;
     }
     break;
   case 32:
@@ -2339,7 +2468,7 @@ ACMD(do_set)
   case 34:
     if (value > GET_LEVEL(ch) || value > LVL_IMPL) {
       send_to_char("You can't do that.\r\n", ch);
-      return;
+      break;
     }
     RANGE(0, LVL_IMPL);
     vict->player.level = (byte) value;
@@ -2347,7 +2476,7 @@ ACMD(do_set)
   case 35:
     if ((i = real_room(value)) < 0) {
       send_to_char("No room exists with that number.\r\n", ch);
-      return;
+      break;
     }
     char_from_room(vict);
     char_to_room(vict, i);
@@ -2364,7 +2493,7 @@ ACMD(do_set)
   case 39:
     if ((i = parse_class(*val_arg)) == CLASS_UNDEFINED) {
       send_to_char("That is not a class.\r\n", ch);
-      return;
+      break;
     }
     GET_CLASS(vict) = i;
     break;
@@ -2396,19 +2525,19 @@ ACMD(do_set)
     break;
   case 44:
     if (GET_IDNUM(ch) != 1 || !IS_NPC(vict))
-      return;
+      break;
     GET_IDNUM(vict) = value;
     break;
   case 45:
     if (!is_file)
-      return;
+      break;
     if (GET_IDNUM(ch) > 1) {
       send_to_char("Please don't use this command, yet.\r\n", ch);
-      return;
+      break;
     }
     if (GET_LEVEL(vict) >= LVL_GRGOD) {
       send_to_char("You cannot change that.\r\n", ch);
-      return;
+      break;
     }
     strncpy(tmp_store.pwd, CRYPT(val_arg, tmp_store.name), MAX_PWD_LENGTH);
     tmp_store.pwd[MAX_PWD_LENGTH] = '\0';
@@ -2461,14 +2590,15 @@ static char *logtypes[] = {
 ACMD(do_syslog)
 {
   int tp;
+  char	*arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
-
   if (!*arg) {
     tp = ((PRF_FLAGGED(ch, PRF_LOG1) ? 1 : 0) +
 	  (PRF_FLAGGED(ch, PRF_LOG2) ? 2 : 0));
-    sprintf(buf, "Your syslog is currently %s.\r\n", logtypes[tp]);
-    send_to_char(buf, ch);
+    sprintf(arg, "Your syslog is currently %s.\r\n", logtypes[tp]);
+    send_to_char(arg, ch);
+    release_buffer(arg);
     return;
   }
   if (((tp = search_block(arg, logtypes, FALSE)) == -1)) {
@@ -2478,6 +2608,6 @@ ACMD(do_syslog)
   REMOVE_BIT(PRF_FLAGS(ch), PRF_LOG1 | PRF_LOG2);
   SET_BIT(PRF_FLAGS(ch), (PRF_LOG1 * (tp & 1)) | (PRF_LOG2 * (tp & 2) >> 1));
 
-  sprintf(buf, "Your syslog is now %s.\r\n", logtypes[tp]);
-  send_to_char(buf, ch);
+  sprintf(arg, "Your syslog is now %s.\r\n", logtypes[tp]);
+  send_to_char(arg, ch);
 }
diff -uprN -x *.o ../stk/ban.c ./ban.c
--- ../stk/ban.c	Thu Jun 19 00:58:36 1997
+++ ./ban.c	Sun Aug 10 22:14:05 1997
@@ -35,8 +35,7 @@ void load_banned(void)
 {
   FILE *fl;
   int i, date;
-  char site_name[BANNED_SITE_LENGTH + 1], ban_type[100];
-  char name[MAX_NAME_LENGTH + 1];
+  char *site_name, *ban_type, *name;
   struct ban_list_element *next_node;
 
   ban_list = 0;
@@ -45,6 +44,11 @@ void load_banned(void)
     perror("Unable to open banfile");
     return;
   }
+
+  site_name = get_buffer(BANNED_SITE_LENGTH + 1);
+  ban_type = get_buffer(100);
+  name = get_buffer(MAX_NAME_LENGTH + 1);
+
   while (fscanf(fl, " %s %s %d %s ", ban_type, site_name, &date, name) == 4) {
     CREATE(next_node, struct ban_list_element, 1);
     strncpy(next_node->site, site_name, BANNED_SITE_LENGTH);
@@ -61,6 +65,9 @@ void load_banned(void)
     ban_list = next_node;
   }
 
+  release_buffer(site_name);
+  release_buffer(ban_type);
+  release_buffer(name);
   fclose(fl);
 }
 
@@ -113,18 +120,22 @@ void write_ban_list(void)
 
 ACMD(do_ban)
 {
-  char flag[MAX_INPUT_LENGTH], site[MAX_INPUT_LENGTH],
-	format[MAX_INPUT_LENGTH], *nextchar, *timestr;
+  char	*flag = get_buffer(MAX_INPUT_LENGTH), 
+	*site = get_buffer(MAX_INPUT_LENGTH),
+	*format = get_buffer(MAX_INPUT_LENGTH),
+	*buf,
+	*nextchar,
+	*timestr;
+
   int i;
   struct ban_list_element *ban_node;
 
-  *buf = '\0';
-
   if (!*argument) {
     if (!ban_list) {
       send_to_char("No sites are banned.\r\n", ch);
       return;
     }
+    buf = get_buffer(MAX_STRING_LENGTH);
     strcpy(format, "%-25.25s  %-8.8s  %-10.10s  %-16.16s\r\n");
     sprintf(buf, format,
 	    "Banned Site Name",
@@ -150,6 +161,7 @@ ACMD(do_ban)
 	      ban_node->name);
       send_to_char(buf, ch);
     }
+    release_buffer(buf);
     return;
   }
   two_arguments(argument, flag, site);
@@ -184,17 +196,19 @@ ACMD(do_ban)
   ban_node->next = ban_list;
   ban_list = ban_node;
 
+  buf = get_buffer(128);
   sprintf(buf, "%s has banned %s for %s players.", GET_NAME(ch), site,
 	  ban_types[ban_node->type]);
   mudlog(buf, NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
   send_to_char("Site banned.\r\n", ch);
+  release_buffer(buf);
   write_ban_list();
 }
 
 
 ACMD(do_unban)
 {
-  char site[80];
+  char *site = get_buffer(80), *buf;
   struct ban_list_element *ban_node, *temp;
   int found = 0;
 
@@ -217,9 +231,11 @@ ACMD(do_unban)
   }
   REMOVE_FROM_LIST(ban_node, ban_list, next);
   send_to_char("Site unbanned.\r\n", ch);
+  buf = get_buffer(128);
   sprintf(buf, "%s removed the %s-player ban on %s.",
 	  GET_NAME(ch), ban_types[ban_node->type], ban_node->site);
   mudlog(buf, NRM, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE);
+  release_buffer(buf);
 
   free(ban_node);
   write_ban_list();
@@ -240,7 +256,7 @@ int Valid_Name(char *newname)
 {
   int i;
 
-  char tempname[MAX_INPUT_LENGTH];
+  char *tempname = get_buffer(MAX_INPUT_LENGTH);
 
   /* return valid if list doesn't exist */
   if (!invalid_list || num_invalid < 1)
@@ -264,16 +280,17 @@ void Read_Invalid_List(void)
 {
   FILE *fp;
   int i = 0;
-  char string[80];
+  char *string;
 
   if (!(fp = fopen(XNAME_FILE, "r"))) {
     perror("Unable to open invalid name file");
     return;
   }
   /* count how many records */
+  string = get_buffer(80);
   while (fgets(string, 80, fp) != NULL && strlen(string) > 1)
     num_invalid++;
-
+  release_buffer(string);
   rewind(fp);
 
   CREATE(invalid_list, namestring, num_invalid);
diff -uprN -x *.o ../stk/boards.c ./boards.c
--- ../stk/boards.c	Thu Jun 19 00:58:36 1997
+++ ./boards.c	Thu Aug 14 14:45:36 1997
@@ -117,7 +117,7 @@ int find_board(struct char_data * ch)
 void init_boards(void)
 {
   int i, j, fatal_error = 0;
-  char buf[256];
+  char *buf;
 
   for (i = 0; i < INDEX_SIZE; i++) {
     msg_storage[i] = 0;
@@ -126,9 +126,11 @@ void init_boards(void)
 
   for (i = 0; i < NUM_OF_BOARDS; i++) {
     if ((BOARD_RNUM(i) = real_object(BOARD_VNUM(i))) == -1) {
+      buf = get_buffer(256);
       sprintf(buf, "SYSERR: Fatal board error: board vnum %d does not exist!",
 	      BOARD_VNUM(i));
       log(buf);
+      release_buffer(buf);
       fatal_error = 1;
     }
     num_of_msgs[i] = 0;
@@ -189,7 +191,7 @@ void Board_write_message(int board_type,
   char *tmstr;
   int len;
   time_t ct;
-  char buf[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH];
+  char *buf, *buf2;
 
   if (GET_LEVEL(ch) < WRITE_LVL(board_type)) {
     send_to_char("You are not holy enough to write on this board.\r\n", ch);
@@ -219,11 +221,16 @@ void Board_write_message(int board_type,
   tmstr = (char *) asctime(localtime(&ct));
   *(tmstr + strlen(tmstr) - 1) = '\0';
 
+  buf = get_buffer(MAX_INPUT_LENGTH);
+  buf2 = get_buffer(MAX_INPUT_LENGTH);
+
   sprintf(buf2, "(%s)", GET_NAME(ch));
   sprintf(buf, "%6.10s %-12s :: %s", tmstr, buf2, arg);
   len = strlen(buf) + 1;
   if (!(NEW_MSG_INDEX(board_type).heading = (char *) malloc(sizeof(char) * len))) {
     send_to_char("The board is malfunctioning - sorry.\r\n", ch);
+    release_buffer(buf2);
+    release_buffer(buf);
     return;
   }
   strcpy(NEW_MSG_INDEX(board_type).heading, buf);
@@ -247,15 +254,19 @@ void Board_write_message(int board_type,
 int Board_show_board(int board_type, struct char_data * ch, char *arg)
 {
   int i;
-  char tmp[MAX_STRING_LENGTH], buf[MAX_STRING_LENGTH];
+  char *tmp, *buf;
 
   if (!ch->desc)
     return 0;
 
+  tmp = get_buffer(MAX_STRING_LENGTH);
   one_argument(arg, tmp);
 
-  if (!*tmp || !isname(tmp, "board bulletin"))
+  if (!*tmp || !isname(tmp, "board bulletin")) {
+    release_buffer(tmp);
     return 0;
+  }
+  release_buffer(tmp);
 
   if (GET_LEVEL(ch) < READ_LVL(board_type)) {
     send_to_char("You try but fail to understand the holy words.\r\n", ch);
@@ -263,6 +274,7 @@ int Board_show_board(int board_type, str
   }
   act("$n studies the board.", TRUE, ch, 0, 0, TO_ROOM);
 
+  buf = get_buffer(MAX_STRING_LENGTH);
   strcpy(buf,
 	 "This is a bulletin board.  Usage: READ/REMOVE <messg #>, WRITE <header>.\r\n"
 	 "You will need to look at the board to save your message.\r\n");
@@ -278,113 +290,115 @@ int Board_show_board(int board_type, str
       else {
 	log("SYSERR: The board is fubar'd.");
 	send_to_char("Sorry, the board isn't working.\r\n", ch);
+        release_buffer(buf);
 	return 1;
       }
     }
   }
   page_string(ch->desc, buf, 1);
 
+  release_buffer(buf);
   return 1;
 }
 
 
 int Board_display_msg(int board_type, struct char_data * ch, char *arg)
 {
-  char number[MAX_STRING_LENGTH], buffer[MAX_STRING_LENGTH];
-  int msg, ind;
+  char *number = get_buffer(MAX_STRING_LENGTH),	*buffer;
+  int msg, rval = 0;
 
   one_argument(arg, number);
   if (!*number)
-    return 0;
-  if (isname(number, "board bulletin"))	/* so "read board" works */
-    return (Board_show_board(board_type, ch, arg));
-  if (!isdigit(*number) || (!(msg = atoi(number))))
-    return 0;
-
-  if (GET_LEVEL(ch) < READ_LVL(board_type)) {
+    rval = 0;
+  else if (isname(number, "board bulletin"))	/* so "read board" works */
+    rval = Board_show_board(board_type, ch, arg);
+  else if (!isdigit(*number) || (!(msg = atoi(number))))
+    rval = 0;
+  else if (GET_LEVEL(ch) < READ_LVL(board_type)) {
     send_to_char("You try but fail to understand the holy words.\r\n", ch);
-    return 1;
-  }
-  if (!num_of_msgs[board_type]) {
+    rval = 1;
+  } else if (!num_of_msgs[board_type]) {
     send_to_char("The board is empty!\r\n", ch);
-    return (1);
-  }
-  if (msg < 1 || msg > num_of_msgs[board_type]) {
-    send_to_char("That message exists only in your imagination.\r\n",
-		 ch);
-    return (1);
-  }
-  ind = msg - 1;
-  if (MSG_SLOTNUM(board_type, ind) < 0 ||
-      MSG_SLOTNUM(board_type, ind) >= INDEX_SIZE) {
+    rval = 1;
+  } else if (msg < 1 || msg > num_of_msgs[board_type]) {
+    send_to_char("That message exists only in your imagination.\r\n", ch);
+    rval = 1;
+  } else if (MSG_SLOTNUM(board_type, msg - 1) < 0 ||
+      MSG_SLOTNUM(board_type, msg - 1) >= INDEX_SIZE) {
     send_to_char("Sorry, the board is not working.\r\n", ch);
     log("SYSERR: Board is screwed up.");
-    return 1;
-  }
-  if (!(MSG_HEADING(board_type, ind))) {
+    rval = 1;
+  } else if (!(MSG_HEADING(board_type, msg - 1))) {
     send_to_char("That message appears to be screwed up.\r\n", ch);
-    return 1;
-  }
-  if (!(msg_storage[MSG_SLOTNUM(board_type, ind)])) {
+    rval = 1;
+  } else if (!(msg_storage[MSG_SLOTNUM(board_type, msg - 1)])) {
     send_to_char("That message seems to be empty.\r\n", ch);
-    return 1;
+    rval = 1;
+  } else {
+    buffer = get_buffer(MAX_STRING_LENGTH);
+    sprintf(buffer, "Message %d : %s\r\n\r\n%s\r\n", msg,
+	  MSG_HEADING(board_type, msg - 1),
+	  msg_storage[MSG_SLOTNUM(board_type, msg - 1)]);
+    page_string(ch->desc, buffer, 1);
+    release_buffer(buffer);
+    rval = 1;
   }
-  sprintf(buffer, "Message %d : %s\r\n\r\n%s\r\n", msg,
-	  MSG_HEADING(board_type, ind),
-	  msg_storage[MSG_SLOTNUM(board_type, ind)]);
-
-  page_string(ch->desc, buffer, 1);
 
-  return 1;
+  release_buffer(number);
+  return rval;
 }
 
-
+/*
+ * XXX: This uses release_and_return;
+ */
 int Board_remove_msg(int board_type, struct char_data * ch, char *arg)
 {
   int ind, msg, slot_num;
-  char number[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH];
+  char *number = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_INPUT_LENGTH);
   struct descriptor_data *d;
 
   one_argument(arg, number);
 
-  if (!*number || !isdigit(*number))
-    return 0;
-  if (!(msg = atoi(number)))
-    return (0);
+  if (!*number || !isdigit(*number)) {	/* The {}'s are required for	*/
+    release_and_return 0;		/* release_and_return;		*/
+  } else if (!(msg = atoi(number))) {
+    release_and_return 0;
+  }
 
   if (!num_of_msgs[board_type]) {
     send_to_char("The board is empty!\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   if (msg < 1 || msg > num_of_msgs[board_type]) {
     send_to_char("That message exists only in your imagination.\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   ind = msg - 1;
   if (!MSG_HEADING(board_type, ind)) {
     send_to_char("That message appears to be screwed up.\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   sprintf(buf, "(%s)", GET_NAME(ch));
   if (GET_LEVEL(ch) < REMOVE_LVL(board_type) &&
       !(strstr(MSG_HEADING(board_type, ind), buf))) {
     send_to_char("You are not holy enough to remove other people's messages.\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   if (GET_LEVEL(ch) < MSG_LEVEL(board_type, ind)) {
     send_to_char("You can't remove a message holier than yourself.\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   slot_num = MSG_SLOTNUM(board_type, ind);
   if (slot_num < 0 || slot_num >= INDEX_SIZE) {
     log("SYSERR: The board is seriously screwed up.");
     send_to_char("That message is majorly screwed up.\r\n", ch);
-    return 1;
+    release_and_return 1;
   }
   for (d = descriptor_list; d; d = d->next)
     if (!d->connected && d->str == &(msg_storage[slot_num])) {
       send_to_char("At least wait until the author is finished before removing it!\r\n", ch);
-      return 1;
+      release_and_return 1;
     }
   if (msg_storage[slot_num])
     free(msg_storage[slot_num]);
@@ -404,7 +418,7 @@ int Board_remove_msg(int board_type, str
   act(buf, FALSE, ch, 0, 0, TO_ROOM);
   Board_save_board(board_type);
 
-  return 1;
+  release_and_return 1;
 }
 
 
diff -uprN -x *.o ../stk/buffer.c ./buffer.c
--- ../stk/buffer.c	Wed Dec 31 19:00:00 1969
+++ ./buffer.c	Tue Aug 19 01:54:20 1997
@@ -0,0 +1,343 @@
+#include "conf.h"
+#include "sysdep.h"
+#include "structs.h"
+#include "utils.h"
+
+/* #include "buffer.h" - already done from structs.h */
+
+/*
+ * Global variables.
+ *  buffers - head of the allocation linked list.
+ *  last_alloc - pointer to last allocated structure, a cache for freeing.
+ */
+struct buf_data *buffers;
+struct buf_data *last_alloc;
+
+/*
+ * #if 1 = memset()
+ * #if 0 = *buffer = '\0'
+ */
+#if 1
+#define PARANOID_BUFFER	1
+#endif
+
+/*
+ * #if 1 = Log only problems
+ * #if 0 = Log all allocations. WARNING! This creates enormous output.
+ */
+#if 1
+byte verbose_buffer = FALSE;
+#else
+byte verbose_buffer = TRUE;
+#endif
+
+#define BUFFER_LIFE	(5*SECS_PER_REAL_MIN*PASSES_PER_SEC) /* 5 mins */
+
+/* Prototypes */
+void send_to_char(char *, struct char_data *);
+
+/*
+ * Public: init_buffers()
+ * This is called from main() to get everything started.
+ */
+void init_buffers(void)
+{
+  buffers = NULL;
+  last_alloc = NULL;
+
+  /*
+   * These are persistant to always have some available.
+   * We're still using less data memory than the original buffer scheme.
+   * New: 8k+8k+1k+1k+512b+256b+512b+256b+256b+128b+128b	= 19.87k
+   * Old: 8k+8k+8k+8k						= 32k
+   * Some log messages are 128 byte buffers, some are SMALL_BUFSIZE,
+   * we need a standard value like SMALL_LOGBUF (128?).
+   */
+  new_buffer(MAX_STRING_LENGTH, TRUE);
+  new_buffer(MAX_STRING_LENGTH, TRUE);
+  new_buffer(SMALL_BUFSIZE, TRUE);
+  new_buffer(SMALL_BUFSIZE, TRUE);
+  new_buffer(MAX_RAW_INPUT_LENGTH, TRUE);
+  new_buffer(MAX_INPUT_LENGTH, TRUE);
+  new_buffer(512, TRUE);
+  new_buffer(256, TRUE);
+  new_buffer(256, TRUE);
+  new_buffer(128, TRUE);
+  new_buffer(128, TRUE);
+
+  /*
+   * This buffer will be used while booting and as a spare buffer
+   * until it times out.  db.c:load_help() uses this if you are
+   * wondering why it is so large.
+   */
+  new_buffer(32384, FALSE);
+}
+
+/*
+ * Public: as release_my_buffers()
+ * This function searches the list of buffers for the name supplied
+ * and releases those buffers.  It is preferable to release each
+ * buffer by name rather than using this function.  This is useful,
+ * however, when there are return statements all over a command.
+ * If we ever go to a thread based system, this function will either
+ * undergo an overhaul or be removed.  It is not very efficient
+ * anyway.
+ */
+void detach_my_buffers(const char *func, const int line_n)
+{
+  struct buf_data *clear, *next_clear;
+
+  for (clear = get_buffer_head(); clear; clear = next_clear) {
+    next_clear = clear->next;
+    if (strcmp(clear->who, func) == 0) {
+      if (verbose_buffer) {
+	char buf[128];
+	sprintf(buf, "BUFFER: %s: %s:%d released %d bytes from %s:%d.",
+		__FUNCTION__, func, line_n, clear->size, clear->who, clear->line);
+	log(buf);
+      }
+      clear_buffer(clear);
+    }
+  }
+}
+
+/*
+ * Public: release_all_buffers()
+ * Forcibly release all buffers currently allocated.  This is useful to
+ * reclaim any forgotten buffers.  This will need a little bit of work
+ * to be thread safe.  With the current setup, we only release one expired
+ * buffer every run through the function.
+ */
+void release_all_buffers()
+{
+  struct buf_data *clear, *next_clear;
+  int freed = FALSE;
+
+  for (clear = get_buffer_head(); clear; clear = next_clear) {
+    next_clear = clear->next;
+    if (clear->used) {
+      char buf[128];
+      sprintf(buf, "BUFFER: %s:%d forgot to release %d bytes.",
+		clear->who, clear->line, clear->size);
+      log(buf);
+      clear_buffer(clear);
+    } else if (clear->life > 0)
+      clear->life--;
+    else if (clear->life != -1 && !freed) {
+      struct buf_data *temp;
+      REMOVE_FROM_LIST(clear, buffers, next);
+      free_buffer(clear);
+      freed = TRUE;
+    }
+  }
+}
+
+/*
+ * Private: clear_buffer(buffer to clear)
+ * This is used to declare an allocated buffer unused.
+ */
+void clear_buffer(struct buf_data *clearme)
+{
+  if (!clearme) {
+    log("BUFFER: Ack! NULL buf_data in clear_buffer.");
+    return;
+  }
+
+#if defined(PARANOID_BUFFER)
+  memset(clearme->data, 0, clearme->size);
+#else
+  *clearme->data = '\0';
+#endif
+  clearme->who = NULL;
+  clearme->line = 0;
+  clearme->life = BUFFER_LIFE;
+  clearme->used = FALSE;
+}
+
+/*
+ * Public: as release_buffer(buffer data pointer)
+ * Used throughout the code to finish their use of the buffer.
+ */
+void detach_buffer(char *data, const char *func, const int line_n)
+{
+  struct buf_data *clear;
+
+  /*
+   * We cache the last allocated buffer to speed up cases where
+   * we allocate a buffer and then free it shortly afterwards.
+   */
+  if (last_alloc && data == last_alloc->data) {
+    clear = last_alloc;
+    last_alloc = NULL;
+  } else
+    for (clear = get_buffer_head(); clear; clear = clear->next)
+      if (clear->data == data)
+        break;
+
+  if (clear) {
+    if (verbose_buffer) {
+      char buf[128];
+      sprintf(buf, "BUFFER: %s:%d released %d bytes from %s:%d.",
+		func, line_n, clear->size, clear->who, clear->line);
+      log(buf);
+    }
+    clear_buffer(clear);
+  } else
+    log("BUFFER: release_buffer: no such buffer found.");
+}
+  
+/*
+ * Private: free_buffer(buffer)
+ * Internal function for getting rid of unused buffers after a time period.
+ */
+void free_buffer(struct buf_data *f)
+{
+  char buf[128];
+
+  if (f->life == -1)
+    sprintf(buf, "SYSERR: BUFFER: Freeing %d byte persistant buffer!", f->size);
+  else
+    sprintf(buf, "BUFFER: Freeing %d bytes in expired buffer.", f->size);
+  log(buf);
+
+  if (f->data)
+    free(f->data);
+  free(f);
+}
+
+/*
+ * Private: get_buffer_head()
+ * For future C++ encapsulation, we'd need a set_buffer_head() also.
+ */
+struct buf_data *get_buffer_head()
+{
+  return buffers;
+}
+
+/*
+ * Private: new_buffer(size of buffer, persistant flag)
+ * Finds where it should place the new buffer to malloc.
+ */
+struct buf_data *new_buffer(ush_int size, bool persistant)
+{
+  struct buf_data *buft = get_buffer_head(), *potential, *prev = NULL;
+
+  /* There aren't any buffers. */
+  if (!buft) {
+    buffers = malloc_buffer(size, persistant);
+    return buffers;
+  }
+
+  /* Insert a buffer */
+  for (; buft; buft = buft->next) {
+    if (size < buft->size) { // insert here
+      potential = malloc_buffer(size, persistant);
+      if (get_buffer_head() == buft)
+        buffers = potential;
+      potential->next = buft;
+      if (prev)
+        prev->next = potential;
+      return potential;
+    }
+    prev = buft;
+  }
+
+  /* Append */
+  if (prev->next)
+    log("BUFFER: Overwrote a buffer.");
+  prev->next = malloc_buffer(size, persistant);
+  return prev->next;
+}
+
+/*
+ * Private: malloc_buffer(size of buffer, persistant flag)
+ * Creates a new buffer for use.
+ */
+struct buf_data *malloc_buffer(ush_int size, bool persistant)
+{
+  struct buf_data *new_buf = (struct buf_data *)malloc(sizeof(struct buf_data));
+
+  new_buf->data = (char *)malloc(size);
+  new_buf->used = FALSE;
+  new_buf->who = NULL;
+  new_buf->line = 0;
+  new_buf->life = (persistant ? -1 : BUFFER_LIFE);
+  new_buf->next = NULL;
+  new_buf->size = size;
+
+  if (verbose_buffer) {
+    char buf[128];
+    sprintf(buf, "BUFFER: Allocated %d byte buffer, %d bytes overhead.",
+		new_buf->size, sizeof(struct buf_data));
+    log(buf);
+  }
+  return new_buf;
+}
+
+/*
+ * Public: as get_buffer(size of buffer)
+ * Requests a buffer from the free pool.  If a buffer of the desired size
+ * is not available, one is created.
+ */
+char *acquire_buffer(ush_int size, const char *who, ush_int line)
+{
+  struct buf_data *give;
+
+  for (give = get_buffer_head(); give; give = give->next)
+    if (!give->used && give->size >= size)
+      break;
+
+  if (!give) {
+    char buf[128];
+    sprintf(buf, "BUFFER: Didn't find %d byte buffer! Making a new one.", size);
+    log(buf);
+    give = new_buffer(size, FALSE);
+  }
+  give->used = TRUE;
+  give->who = who;
+  give->line = line;
+  if (verbose_buffer) {
+    char buf[128];
+    sprintf(buf, "BUFFER: %s:%d requested %d bytes, received %d.",
+		who, line, size, give->size);
+    log(buf);
+  }
+  /*
+   * This warning denotes one of two possible conditions:
+   *  1) Someone release_buffer()'d and kept using it.
+   *  2) Our memory space was overwritten.
+   */
+  if (*give->data != '\0') {
+    log("WARNING: BUFFER: Given buffer is not NULL as it ought to be.");
+    *give->data = '\0';
+  }
+  last_alloc = give;	/* Cache this entry. */
+  return give->data;
+}
+
+/*
+ * This is really only useful to see who has lingering buffers around
+ * or if you are curious.  It can't be called in the middle of a
+ * command run by a player so it'll usually show the same thing.
+ * You can call this with a NULL parameter to have it logged at any
+ * time though.
+ */
+void show_buffers(struct char_data *ch)
+{
+  struct buf_data *disp;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+  int pos = 0, i = 0;
+  *buf = '\0';
+
+  for (disp = get_buffer_head(); disp; disp = disp->next)
+    pos += sprintf(buf + pos, "%3d. %5d bytes, %5d life, %s:%d.\r\n", ++i,
+		disp->size, disp->life, disp->used ? disp->who : "unused",
+		disp->used ? disp->line : 0);
+
+  if (ch)
+    send_to_char(buf, ch);
+  else
+    log(buf);
+
+  release_buffer(buf);
+}
diff -uprN -x *.o ../stk/buffer.h ./buffer.h
--- ../stk/buffer.h	Wed Dec 31 19:00:00 1969
+++ ./buffer.h	Tue Aug 19 01:55:18 1997
@@ -0,0 +1,44 @@
+#if !defined(_BUFFER_H_)
+#define _BUFFER_H_
+
+/*
+ * #if 1 = Include original CircleMUD buffers too.
+ * #if 0 = Use only new buffer system.
+ */
+#if 0
+#define USE_CIRCLE_BUFFERS 1
+#endif
+
+struct buf_data {
+  bool used;
+  ush_int size;
+  ush_int line;
+  sh_int life;
+  char *data;
+  const char *who;
+  struct buf_data *next;
+};
+
+/*
+ * Some macros to imitate C++ class styles.
+ * release_and_return is odd but it must be that way to allow values.
+ * release_buffer() automatically NULL's pointer to prevent further use.
+ */
+#define get_buffer(a)		acquire_buffer((a), __FUNCTION__, __LINE__)
+#define release_buffer(a)	do { detach_buffer((a), __FUNCTION__, __LINE__); (a) = NULL; } while (0)
+#define release_my_buffers()	detach_my_buffers(__FUNCTION__, __LINE__)
+#define release_and_return	release_my_buffers(); return
+
+void init_buffers(void);
+void release_all_buffers();
+void clear_buffer(struct buf_data *clearme);
+void detach_buffer(char *data, const char *func, const int line_n);
+void detach_my_buffers(const char *func, const int line_n);
+struct buf_data *new_buffer(ush_int size, bool persistant);
+struct buf_data *malloc_buffer(ush_int size, bool persistant);
+struct buf_data *get_buffer_head(void);
+char *acquire_buffer(ush_int size, const char *who, ush_int line);
+void show_buffers(struct char_data *ch);
+void free_buffer(struct buf_data *f);
+
+#endif
diff -uprN -x *.o ../stk/castle.c ./castle.c
--- ../stk/castle.c	Thu Jun 19 00:58:36 1997
+++ ./castle.c	Sat Aug 16 22:55:16 1997
@@ -555,7 +555,6 @@ SPECIAL(training_master)
 
 SPECIAL(tom)
 {
-
   struct char_data *king, *tim;
 
   ACMD(do_follow);
@@ -577,13 +576,12 @@ SPECIAL(tom)
   if (!cmd && GET_POS(ch) != POS_FIGHTING)
     banzaii(ch);
 
-  return block_way(ch, cmd, arg, CASTLE_ITEM(49), 1);
+  return block_way(ch, cmd, NULL, CASTLE_ITEM(49), 1);
 }
 
 
 SPECIAL(tim)
 {
-
   struct char_data *king, *tom;
 
   ACMD(do_follow);
@@ -605,7 +603,7 @@ SPECIAL(tim)
   if (!cmd && GET_POS(ch) != POS_FIGHTING)
     banzaii(ch);
 
-  return block_way(ch, cmd, arg, CASTLE_ITEM(49), 1);
+  return block_way(ch, cmd, NULL, CASTLE_ITEM(49), 1);
 }
 
 
@@ -672,14 +670,13 @@ SPECIAL(CastleGuard)
 /* Routine for the guards Dick and David */
 SPECIAL(DicknDavid)
 {
-
   if (!AWAKE(ch))
     return (FALSE);
 
   if (!cmd && GET_POS(ch) != POS_FIGHTING)
     banzaii(ch);
 
-  return (block_way(ch, cmd, arg, CASTLE_ITEM(36), 1));
+  return (block_way(ch, cmd, NULL, CASTLE_ITEM(36), 1));
 }
 
 
diff -uprN -x *.o ../stk/class.c ./class.c
--- ../stk/class.c	Thu Jun 19 00:58:36 1997
+++ ./class.c	Sat Aug 16 22:55:54 1997
@@ -21,8 +21,8 @@
 #include "sysdep.h"
 
 #include "structs.h"
-#include "db.h"
 #include "utils.h"
+#include "db.h"
 #include "spells.h"
 #include "interpreter.h"
 
@@ -345,6 +345,7 @@ void do_start(struct char_data * ch)
  */
 void advance_level(struct char_data * ch)
 {
+  char *buf;
   int add_hp = 0, add_mana = 0, add_move = 0, i;
 
   extern struct wis_app_type wis_app[];
@@ -400,8 +401,10 @@ void advance_level(struct char_data * ch
 
   save_char(ch, NOWHERE);
 
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "%s advanced to level %d", GET_NAME(ch), GET_LEVEL(ch));
   mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+  release_buffer(buf);
 }
 
 
diff -uprN -x *.o ../stk/comm.c ./comm.c
--- ../stk/comm.c	Thu Jun 19 00:58:36 1997
+++ ./comm.c	Tue Aug 19 00:53:24 1997
@@ -134,10 +134,14 @@ void gettimeofday(struct timeval *t, str
 int main(int argc, char **argv)
 {
   int port;
-  char buf[512];
+  char *buf;
   int pos = 1;
   char *dir;
 
+  /* Start up the better buffer system. */
+  init_buffers();
+
+  buf = get_buffer(512);
   port = DFLT_PORT;
   dir = DFLT_DIR;
 
@@ -209,6 +213,7 @@ int main(int argc, char **argv)
   } else {
     sprintf(buf, "Running game on port %d.", port);
     log(buf);
+    release_buffer(buf);
     init_game(port);
   }
 
@@ -358,6 +363,7 @@ int get_max_players(void)
 
   int max_descs = 0;
   char *method;
+  char *buf = get_buffer(128);
 
 /*
  * First, we'll try using getrlimit/setrlimit.  This will probably work
@@ -427,10 +433,12 @@ int get_max_players(void)
     sprintf(buf, "Non-positive max player limit!  (Set at %d using %s).",
 	    max_descs, method);
     log(buf);
+    release_buffer(buf);
     exit(1);
   }
   sprintf(buf, "Setting player limit to %d using %s.", max_descs, method);
   log(buf);
+  release_buffer(buf);
   return max_descs;
 #endif				/* WINDOWS or OS2 */
 }
@@ -448,7 +456,7 @@ void game_loop(int mother_desc)
 {
   fd_set input_set, output_set, exc_set, null_set;
   struct timeval last_time, before_sleep, opt_time, process_time, now, timeout;
-  char comm[MAX_INPUT_LENGTH];
+  char *comm;
   struct descriptor_data *d, *next_d;
   int pulse = 0, missed_pulses, maxdesc, aliased;
 
@@ -568,6 +576,7 @@ void game_loop(int mother_desc)
 	  close_socket(d);
     }
 
+    comm = get_buffer(MAX_INPUT_LENGTH);
     /* process commands we just read from process_input */
     for (d = descriptor_list; d; d = next_d) {
       next_d = d->next;
@@ -604,6 +613,7 @@ void game_loop(int mother_desc)
 	}
       }
     }
+    release_buffer(comm);
 
     /* send queued output out to the operating system (ultimately to user) */
     for (d = descriptor_list; d; d = next_d) {
@@ -672,6 +682,10 @@ void heartbeat(int pulse)
   if (!(pulse % (15 * PASSES_PER_SEC)))		/* 15 seconds */
     check_idle_passwords();
 
+  /* Clear out all the global buffers now in case someone forgot. */
+  if (!(pulse % PULSE_BUFFER))
+    release_all_buffers();
+
   if (!(pulse % PULSE_MOBILE))
     mobile_activity();
 
@@ -756,7 +770,7 @@ void record_usage(void)
 {
   int sockets_connected = 0, sockets_playing = 0;
   struct descriptor_data *d;
-  char buf[256];
+  char *buf = get_buffer(256);
 
   for (d = descriptor_list; d; d = d->next) {
     sockets_connected++;
@@ -778,7 +792,7 @@ void record_usage(void)
     log(buf);
   }
 #endif
-
+  release_buffer(buf);
 }
 
 
@@ -821,7 +835,7 @@ void echo_on(struct descriptor_data *d)
 
 void make_prompt(struct descriptor_data *d)
 {
-  char prompt[MAX_INPUT_LENGTH];
+  char *prompt = get_buffer(MAX_INPUT_LENGTH);
 
   if (d->str)
     write_to_descriptor(d->descriptor, "] ");
@@ -831,8 +845,6 @@ void make_prompt(struct descriptor_data 
 	    d->showstr_page, d->showstr_count);
     write_to_descriptor(d->descriptor, prompt);
   } else if (!d->connected) {
-    char prompt[MAX_INPUT_LENGTH];
-
     *prompt = '\0';
 
     if (GET_INVIS_LEV(d->character))
@@ -850,6 +862,7 @@ void make_prompt(struct descriptor_data 
     strcat(prompt, "> ");
     write_to_descriptor(d->descriptor, prompt);
   }
+  release_buffer(prompt);
 }
 
 
@@ -900,12 +913,14 @@ int get_from_q(struct txt_q *queue, char
 void flush_queues(struct descriptor_data *d)
 {
   int dummy;
+  char *buf2 = get_buffer(MAX_STRING_LENGTH);
 
   if (d->large_outbuf) {
     d->large_outbuf->next = bufpool;
     bufpool = d->large_outbuf;
   }
   while (get_from_q(&d->input, buf2, &dummy));
+  release_buffer(buf2);
 }
 
 /* Add a new string to a player's output queue */
@@ -1020,10 +1035,12 @@ int new_descriptor(int s)
 
   /* determine if the site is banned */
   if (isbanned(newd->host) == BAN_ALL) {
+    char *buf2 = get_buffer(128);
     CLOSE_SOCKET(desc);
     sprintf(buf2, "Connection attempt denied from [%s]", newd->host);
     mudlog(buf2, CMP, LVL_GOD, TRUE);
     free(newd);
+    release_buffer(buf2);
     return 0;
   }
 #if 0
@@ -1058,7 +1075,7 @@ int new_descriptor(int s)
 
 int process_output(struct descriptor_data *t)
 {
-  static char i[LARGE_BUFSIZE + GARBAGE_SPACE];
+  char *i = get_buffer(LARGE_BUFSIZE + GARBAGE_SPACE);
   static int result;
 
   /* we may need this \r\n for later -- see below */
@@ -1105,6 +1122,7 @@ int process_output(struct descriptor_dat
   t->bufptr = 0;
   *(t->output) = '\0';
 
+  release_buffer(i);
   return result;
 }
 
@@ -1150,7 +1168,7 @@ int process_input(struct descriptor_data
 {
   int buf_length, bytes_read, space_left, failed_subst;
   char *ptr, *read_point, *write_point, *nl_pos = NULL;
-  char tmp[MAX_INPUT_LENGTH + 8];
+  char *tmp;
 
   /* first, find the point where we left off reading data */
   buf_length = strlen(t->inbuf);
@@ -1221,6 +1239,7 @@ int process_input(struct descriptor_data
 
   read_point = t->inbuf;
 
+  tmp = get_buffer(MAX_INPUT_LENGTH + 8);
   while (nl_pos != NULL) {
     write_point = tmp;
     space_left = MAX_INPUT_LENGTH - 1;
@@ -1246,11 +1265,15 @@ int process_input(struct descriptor_data
     *write_point = '\0';
 
     if ((space_left <= 0) && (ptr < nl_pos)) {
-      char buffer[MAX_INPUT_LENGTH + 64];
+      char *buffer = get_buffer(MAX_INPUT_LENGTH + 64);
 
       sprintf(buffer, "Line too long.  Truncated to:\r\n%s\r\n", tmp);
-      if (write_to_descriptor(t->descriptor, buffer) < 0)
+      if (write_to_descriptor(t->descriptor, buffer) < 0) {
+        release_buffer(tmp);
+        release_buffer(buffer);
 	return -1;
+      }
+      release_buffer(buffer);
     }
     if (t->snoop_by) {
       SEND_TO_Q("% ", t->snoop_by);
@@ -1287,6 +1310,7 @@ int process_input(struct descriptor_data
     *(write_point++) = *(read_point++);
   *write_point = '\0';
 
+  release_buffer(tmp);
   return 1;
 }
 
@@ -1299,7 +1323,7 @@ int process_input(struct descriptor_data
  */
 int perform_subst(struct descriptor_data *t, char *orig, char *subst)
 {
-  char new[MAX_INPUT_LENGTH + 5];
+  char *new = get_buffer(MAX_INPUT_LENGTH + 5);
 
   char *first, *second, *strpos;
 
@@ -1312,6 +1336,7 @@ int perform_subst(struct descriptor_data
   /* now find the second '^' */
   if (!(second = strchr(first, '^'))) {
     SEND_TO_Q("Invalid substitution.\r\n", t);
+    release_buffer(new);
     return 1;
   }
   /* terminate "first" at the position of the '^' and make 'second' point
@@ -1321,6 +1346,7 @@ int perform_subst(struct descriptor_data
   /* now, see if the contents of the first string appear in the original */
   if (!(strpos = strstr(orig, first))) {
     SEND_TO_Q("Invalid substitution.\r\n", t);
+    release_buffer(new);
     return 1;
   }
   /* now, we construct the new string for output. */
@@ -1341,6 +1367,7 @@ int perform_subst(struct descriptor_data
   new[MAX_INPUT_LENGTH - 1] = '\0';
   strcpy(subst, new);
 
+  release_buffer(new);
   return 0;
 }
 
@@ -1348,7 +1375,7 @@ int perform_subst(struct descriptor_data
 
 void close_socket(struct descriptor_data *d)
 {
-  char buf[128];
+  char *buf = get_buffer(128);
   struct descriptor_data *temp;
   long target_idnum = -1;
 
@@ -1392,6 +1419,7 @@ void close_socket(struct descriptor_data
     free(d->showstr_vector);
 
   free(d);
+  release_buffer(buf);
 }
 
 
@@ -1652,7 +1680,8 @@ void perform_act(char *orig, struct char
 		 void *vict_obj, struct char_data *to)
 {
   register char *i = NULL, *buf;
-  static char lbuf[MAX_STRING_LENGTH];
+  char *lbuf = get_buffer(MAX_STRING_LENGTH);
+  char *buf1 = get_buffer(MAX_STRING_LENGTH);
 
   buf = lbuf;
 
@@ -1729,6 +1758,8 @@ void perform_act(char *orig, struct char
   *(++buf) = '\0';
 
   SEND_TO_Q(CAP(lbuf), to->desc);
+  release_buffer(buf1);
+  release_buffer(lbuf);
 }
 
 
diff -uprN -x *.o ../stk/db.c ./db.c
--- ../stk/db.c	Thu Jun 19 00:58:37 1997
+++ ./db.c	Tue Aug 19 01:37:28 1997
@@ -142,6 +142,7 @@ void reboot_wizlists(void)
 ACMD(do_reboot)
 {
   int i;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -197,6 +198,7 @@ ACMD(do_reboot)
   }
 
   send_to_char(OK, ch);
+  release_buffer(arg);
 }
 
 
@@ -235,6 +237,7 @@ void boot_world(void)
 void boot_db(void)
 {
   int i;
+  char *buf2;
 
   log("Boot db -- BEGIN.");
 
@@ -305,6 +308,7 @@ void boot_db(void)
     update_obj_file();
     log("Done.");
   }
+  buf2 = get_buffer(128);
   for (i = 0; i <= top_of_zone_table; i++) {
     sprintf(buf2, "Resetting %s (rooms %d-%d).",
 	    zone_table[i].name, (i ? (zone_table[i - 1].top + 1) : 0),
@@ -312,6 +316,7 @@ void boot_db(void)
     log(buf2);
     reset_zone(i);
   }
+  release_buffer(buf2);
 
   reset_q.head = reset_q.tail = NULL;
 
@@ -330,6 +335,7 @@ void reset_time(void)
 {
   long beginning_of_time = 650336715;
   struct time_info_data mud_time_passed(time_t t2, time_t t1);
+  char *buf;
 
   time_info = mud_time_passed(time(0), beginning_of_time);
 
@@ -344,9 +350,11 @@ void reset_time(void)
   else
     weather_info.sunlight = SUN_DARK;
 
+  buf = get_buffer(128);
   sprintf(buf, "   Current Gametime: %dH %dD %dM %dY.", time_info.hours,
 	  time_info.day, time_info.month, time_info.year);
   log(buf);
+  release_buffer(buf);
 
   weather_info.pressure = 960;
   if ((time_info.month >= 7) && (time_info.month <= 12))
@@ -396,8 +404,10 @@ void build_player_index(void)
     fprintf(stderr, "\aWARNING:  PLAYERFILE IS PROBABLY CORRUPT!\n");
   recs = size / sizeof(struct char_file_u);
   if (recs) {
+    char *buf = get_buffer(128);
     sprintf(buf, "   %ld players in database.", recs);
     log(buf);
+    release_buffer(buf);
     CREATE(player_table, struct player_index_element, recs);
   } else {
     player_table = NULL;
@@ -425,13 +435,14 @@ void build_player_index(void)
 /* function to count how many hash-mark delimited records exist in a file */
 int count_hash_records(FILE * fl)
 {
-  char buf[128];
+  char *buf = get_buffer(128);
   int count = 0;
 
   while (fgets(buf, 128, fl))
     if (*buf == '#')
       count++;
 
+  release_buffer(buf);
   return count;
 }
 
@@ -439,9 +450,15 @@ int count_hash_records(FILE * fl)
 
 void index_boot(int mode)
 {
-  char *index_filename, *prefix;
   FILE *index, *db_file;
   int rec_count = 0;
+  char *index_filename, *prefix,
+	*buf1, *buf2;	/* 256 enough for these? */
+
+  /*
+   * XXX: Just in case, although probably not necessary.
+   */
+  release_all_buffers();
 
   switch (mode) {
   case DB_BOOT_WLD:
@@ -473,8 +490,10 @@ void index_boot(int mode)
   else
     index_filename = INDEX_FILE;
 
+  buf2 = get_buffer(256);
   sprintf(buf2, "%s/%s", prefix, index_filename);
 
+  buf1 = get_buffer(256);
   if (!(index = fopen(buf2, "r"))) {
     sprintf(buf1, "Error opening index file '%s'", buf2);
     perror(buf1);
@@ -502,8 +521,11 @@ void index_boot(int mode)
 
   /* Exit if 0 records, unless this is shops */
   if (!rec_count) {
-    if (mode == DB_BOOT_SHP)
+    if (mode == DB_BOOT_SHP) {
+      release_buffer(buf1);
+      release_buffer(buf2);
       return;
+    }
     log("SYSERR: boot error - 0 records counted");
     exit(1);
   }
@@ -565,13 +587,15 @@ void index_boot(int mode)
     top_of_helpt--;
   }
 
+  release_buffer(buf2);
+  release_buffer(buf1);
 }
 
 
 void discrete_load(FILE * fl, int mode)
 {
   int nr = -1, last = 0;
-  char line[256];
+  char *line = get_buffer(256);
 
   char *modes[] = {"world", "mob", "obj"};
 
@@ -585,8 +609,10 @@ void discrete_load(FILE * fl, int mode)
 	fprintf(stderr, "Format error after %s #%d\n", modes[mode], nr);
 	exit(1);
       }
-    if (*line == '$')
+    if (*line == '$') {
+      release_buffer(line);
       return;
+    }
 
     if (*line == '#') {
       last = nr;
@@ -594,9 +620,10 @@ void discrete_load(FILE * fl, int mode)
 	fprintf(stderr, "Format error after %s #%d\n", modes[mode], last);
 	exit(1);
       }
-      if (nr >= 99999)
-	return;
-      else
+      if (nr >= 99999) {
+	release_buffer(line);
+        return;
+      } else
 	switch (mode) {
 	case DB_BOOT_WLD:
 	  parse_room(fl, nr);
@@ -646,8 +673,11 @@ void parse_room(FILE * fl, int virtual_n
 {
   static int room_nr = 0, zone = 0;
   int t[10], i;
-  char line[256], flags[128];
   struct extra_descr_data *new_descr;
+  char	*line = get_buffer(256),
+	*flags = get_buffer(128),
+	*buf2 = get_buffer(128),
+	*buf = get_buffer(128);
 
   sprintf(buf2, "room #%d", virtual_nr);
 
@@ -703,6 +733,10 @@ void parse_room(FILE * fl, int virtual_n
       break;
     case 'S':			/* end of room */
       top_of_world = room_nr++;
+      release_buffer(flags);
+      release_buffer(line);
+      release_buffer(buf2);
+      release_buffer(buf);
       return;
       break;
     default:
@@ -715,11 +749,13 @@ void parse_room(FILE * fl, int virtual_n
 
 
 
+
 /* read direction data */
 void setup_dir(FILE * fl, int room, int dir)
 {
   int t[5];
-  char line[256];
+  char	*line = get_buffer(256),
+	*buf2 = get_buffer(128);
 
   sprintf(buf2, "room #%d, direction D%d", world[room].number, dir);
 
@@ -744,6 +780,8 @@ void setup_dir(FILE * fl, int room, int 
 
   world[room].dir_option[dir]->key = t[1];
   world[room].dir_option[dir]->to_room = t[2];
+  release_buffer(line);
+  release_buffer(buf2);
 }
 
 
@@ -836,7 +874,7 @@ void renum_zone_table(void)
 void parse_simple_mob(FILE *mob_f, int i, int nr)
 {
   int j, t[10];
-  char line[256];
+  char *line = get_buffer(256);
 
     mob_proto[i].real_abils.str = 11;
     mob_proto[i].real_abils.intel = 11;
@@ -897,6 +935,8 @@ void parse_simple_mob(FILE *mob_f, int i
      */
     for (j = 0; j < 5; j++)
       GET_SAVE(mob_proto + i, j) = 0;
+
+  release_buffer(line);
 }
 
 
@@ -982,14 +1022,15 @@ void parse_espec(char *buf, int i, int n
 
 void parse_enhanced_mob(FILE *mob_f, int i, int nr)
 {
-  char line[256];
+  char *line = get_buffer(256);
 
   parse_simple_mob(mob_f, i, nr);
 
   while (get_line(mob_f, line)) {
-    if (!strcmp(line, "E"))	/* end of the ehanced section */
+    if (!strcmp(line, "E")) {	/* end of the ehanced section */
+      release_buffer(line);
       return;
-    else if (*line == '#') {	/* we've hit the next mob, maybe? */
+    } else if (*line == '#') {	/* we've hit the next mob, maybe? */
       fprintf(stderr, "Unterminated E section in mob #%d\n", nr);
       exit(1);
     } else
@@ -1005,8 +1046,12 @@ void parse_mobile(FILE * mob_f, int nr)
 {
   static int i = 0;
   int j, t[10];
-  char line[256], *tmpptr, letter;
-  char f1[128], f2[128];
+  char	*line = get_buffer(256),
+	*f1 = get_buffer(128),
+	*f2 = get_buffer(128),
+	*buf2 = get_buffer(128),
+	*tmpptr, 
+	letter;
 
   mob_index[i].virtual = nr;
   mob_index[i].number = 0;
@@ -1059,6 +1104,11 @@ void parse_mobile(FILE * mob_f, int nr)
   mob_proto[i].desc = NULL;
 
   top_of_mobt = i++;
+
+  release_buffer(line);
+  release_buffer(f1);
+  release_buffer(f2);
+  release_buffer(buf2);
 }
 
 
@@ -1070,8 +1120,11 @@ char *parse_object(FILE * obj_f, int nr)
   static int i = 0, retval;
   static char line[256];
   int t[10], j;
-  char *tmpptr;
-  char f1[256], f2[256];
+  char	*tmpptr,
+	*f1 = get_buffer(256),
+	*f2 = get_buffer(256),
+	*buf2 = get_buffer(128);
+
   struct extra_descr_data *new_descr;
 
   obj_index[i].virtual = nr;
@@ -1173,6 +1226,9 @@ char *parse_object(FILE * obj_f, int nr)
     case '$':
     case '#':
       top_of_objt = i++;
+      release_buffer(f1);
+      release_buffer(f2);
+      release_buffer(buf2);
       return line;
       break;
     default:
@@ -1191,7 +1247,10 @@ void load_zones(FILE * fl, char *zonenam
 {
   static int zone = 0;
   int cmd_no = 0, num_of_cmds = 0, line_num = 0, tmp, error;
-  char *ptr, buf[256], zname[256];
+  char	*ptr,
+	*buf = get_buffer(256),
+	*zname = get_buffer(256),
+	*buf2 = get_buffer(128);
 
   strcpy(zname, zonename);
 
@@ -1264,6 +1323,9 @@ void load_zones(FILE * fl, char *zonenam
   }
 
   top_of_zone_table = zone++;
+  release_buffer(buf);
+  release_buffer(zname);
+  release_buffer(buf2);
 }
 
 #undef Z
@@ -1282,8 +1344,10 @@ void get_one_line(FILE *fl, char *buf)
 
 void load_help(FILE *fl)
 {
-  char key[READ_SIZE+1], next_key[READ_SIZE+1], entry[32384];
-  char line[READ_SIZE+1], *scan;
+  char *key = get_buffer(READ_SIZE+1),
+	*next_key = get_buffer(READ_SIZE+1),
+	*entry = get_buffer(32384);
+  char *line = get_buffer(READ_SIZE+1), *scan;
   struct help_index_element el;
 
   /* get the first keyword line */
@@ -1311,6 +1375,10 @@ void load_help(FILE *fl)
     /* get next keyword line (or $) */
     get_one_line(fl, key);
   }
+  release_buffer(key);
+  release_buffer(next_key);
+  release_buffer(entry);
+  release_buffer(line);
 }
 
 
@@ -1334,6 +1402,7 @@ int hsort(const void *a, const void *b)
 int vnum_mobile(char *searchname, struct char_data * ch)
 {
   int nr, found = 0;
+  char *buf = get_buffer(SMALL_BUFSIZE);
 
   for (nr = 0; nr <= top_of_mobt; nr++) {
     if (isname(searchname, mob_proto[nr].player.name)) {
@@ -1344,6 +1413,7 @@ int vnum_mobile(char *searchname, struct
     }
   }
 
+  release_buffer(buf);
   return (found);
 }
 
@@ -1352,6 +1422,7 @@ int vnum_mobile(char *searchname, struct
 int vnum_object(char *searchname, struct char_data * ch)
 {
   int nr, found = 0;
+  char *buf = get_buffer(SMALL_BUFSIZE);
 
   for (nr = 0; nr <= top_of_objt; nr++) {
     if (isname(searchname, obj_proto[nr].name)) {
@@ -1361,6 +1432,7 @@ int vnum_object(char *searchname, struct
       send_to_char(buf, ch);
     }
   }
+  release_buffer(buf);
   return (found);
 }
 
@@ -1387,7 +1459,10 @@ struct char_data *read_mobile(int nr, in
 
   if (type == VIRTUAL) {
     if ((i = real_mobile(nr)) < 0) {
+      char *buf = get_buffer(128);
       sprintf(buf, "Mobile (V) %d does not exist in database.", nr);
+      log(buf);
+      release_buffer(buf);
       return (0);
     }
   } else
@@ -1445,7 +1520,10 @@ struct obj_data *read_object(int nr, int
   }
   if (type == VIRTUAL) {
     if ((i = real_object(nr)) < 0) {
+      char *buf = get_buffer(128);
       sprintf(buf, "Object (V) %d does not exist in database.", nr);
+      log(buf);
+      release_buffer(buf);
       return NULL;
     }
   } else
@@ -1472,7 +1550,7 @@ void zone_update(void)
   int i;
   struct reset_q_element *update_u, *temp;
   static int timer = 0;
-  char buf[128];
+  char *buf = get_buffer(128);
 
   /* jelson 10/22/92 */
   if (((++timer * PULSE_ZONE) / PASSES_PER_SEC) >= 60) {
@@ -1537,11 +1615,12 @@ void zone_update(void)
       free(update_u);
       break;
     }
+  release_buffer(buf);
 }
 
 void log_zone_error(int zone, int cmd_no, char *message)
 {
-  char buf[256];
+  char *buf = get_buffer(256);
 
   sprintf(buf, "SYSERR: error in zone file: %s", message);
   mudlog(buf, NRM, LVL_GOD, TRUE);
@@ -1549,6 +1628,8 @@ void log_zone_error(int zone, int cmd_no
   sprintf(buf, "SYSERR: ...offending cmd: '%c' cmd in zone #%d, line %d",
 	  ZCMD.command, zone_table[zone].number, ZCMD.line);
   mudlog(buf, NRM, LVL_GOD, TRUE);
+
+  release_buffer(buf);
 }
 
 #define ZONE_ERROR(message) \
@@ -1712,12 +1793,16 @@ int is_empty(int zone_nr)
 long get_id_by_name(char *name)
 {
   int i;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(name, arg);
   for (i = 0; i <= top_of_p_table; i++)
-    if (!strcmp((player_table + i)->name, arg))
+    if (!strcmp((player_table + i)->name, arg)) {
+      release_buffer(arg);
       return ((player_table + i)->id);
+    }
 
+  release_buffer(arg);
   return -1;
 }
 
@@ -1989,7 +2074,7 @@ int create_entry(char *name)
 /* read and allocate space for a '~'-terminated string from a given file */
 char *fread_string(FILE * fl, char *error)
 {
-  char buf[MAX_STRING_LENGTH], tmp[512], *rslt;
+  char *buf = get_buffer(MAX_STRING_LENGTH), *tmp = get_buffer(512), *rslt;
   register char *point;
   int done = 0, length = 0, templength = 0;
 
@@ -2031,6 +2116,8 @@ char *fread_string(FILE * fl, char *erro
   } else
     rslt = NULL;
 
+  release_buffer(tmp);
+  release_buffer(buf);
   return rslt;
 }
 
@@ -2141,16 +2228,17 @@ void free_obj(struct obj_data * obj)
 /* read contets of a text file, alloc space, point buf to it */
 int file_to_string_alloc(char *name, char **buf)
 {
-  char temp[MAX_STRING_LENGTH];
+  char *temp = get_buffer(MAX_STRING_LENGTH);
 
   if (*buf)
     free(*buf);
 
   if (file_to_string(name, temp) < 0) {
-    *buf = "";
+    release_buffer(temp);
     return -1;
   } else {
     *buf = str_dup(temp);
+    release_buffer(temp);
     return 0;
   }
 }
@@ -2160,13 +2248,14 @@ int file_to_string_alloc(char *name, cha
 int file_to_string(char *name, char *buf)
 {
   FILE *fl;
-  char tmp[READ_SIZE+3];
+  char *tmp = get_buffer(READ_SIZE+3);
 
   *buf = '\0';
 
   if (!(fl = fopen(name, "r"))) {
     sprintf(tmp, "Error reading %s", name);
     perror(tmp);
+    release_buffer(tmp);
     return (-1);
   }
   do {
@@ -2180,6 +2269,7 @@ int file_to_string(char *name, char *buf
 		MAX_STRING_LENGTH);
 	log(buf);
 	*buf = '\0';
+        release_buffer(tmp);
 	return -1;
       }
       strcat(buf, tmp);
@@ -2188,6 +2278,7 @@ int file_to_string(char *name, char *buf
 
   fclose(fl);
 
+  release_buffer(tmp);
   return (0);
 }
 
diff -uprN -x *.o ../stk/db.h ./db.h
--- ../stk/db.h	Thu Jun 19 00:58:37 1997
+++ ./db.h	Sun Aug  3 19:34:35 1997
@@ -173,8 +173,12 @@ struct ban_list_element {
 };
 
 
-/* global buffering system */
+/* global buffering system -- removed for better */
+#if !defined(_BUFFER_H_)
+#include "buffer.h"
+#endif
 
+#if defined(USE_CIRCLE_BUFFERS)	/* buffer.h */
 #ifdef __DB_C__
 char	buf[MAX_STRING_LENGTH];
 char	buf1[MAX_STRING_LENGTH];
@@ -185,6 +189,7 @@ extern char	buf[MAX_STRING_LENGTH];
 extern char	buf1[MAX_STRING_LENGTH];
 extern char	buf2[MAX_STRING_LENGTH];
 extern char	arg[MAX_STRING_LENGTH];
+#endif
 #endif
 
 #ifndef __CONFIG_C__
diff -uprN -x *.o ../stk/errors ./errors
--- ../stk/errors	Wed Dec 31 19:00:00 1969
+++ ./errors	Sat Aug  9 23:53:10 1997
@@ -0,0 +1,339 @@
+make ../bin/circle
+make[1]: Entering directory `/home/greerga/mud/wrk/circle30bpl11/buf'
+gcc -c -g -O -Wall -fno-strict-prototypes  act.wizard.c
+act.wizard.c:2047: warning: #warning do_set: does not release_buffer()
+act.wizard.c: In function `do_echo':
+act.wizard.c:80: `buf' undeclared (first use this function)
+act.wizard.c:80: (Each undeclared identifier is reported only once
+act.wizard.c:80: for each function it appears in.)
+act.wizard.c: In function `do_send':
+act.wizard.c:96: `arg' undeclared (first use this function)
+act.wizard.c:96: `buf' undeclared (first use this function)
+act.wizard.c:111: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_at':
+act.wizard.c:188: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_goto':
+act.wizard.c:227: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_trans':
+act.wizard.c:251: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_teleport':
+act.wizard.c:300: `buf' undeclared (first use this function)
+act.wizard.c:300: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_vnum':
+act.wizard.c:327: `buf' undeclared (first use this function)
+act.wizard.c:327: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_stat_room':
+act.wizard.c:352: `buf' undeclared (first use this function)
+act.wizard.c:356: `buf2' undeclared (first use this function)
+act.wizard.c:424: `buf1' undeclared (first use this function)
+act.wizard.c: In function `do_stat_object':
+act.wizard.c:452: `buf' undeclared (first use this function)
+act.wizard.c:456: `buf1' undeclared (first use this function)
+act.wizard.c:458: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_stat_character':
+act.wizard.c:623: `buf' undeclared (first use this function)
+act.wizard.c:629: `buf2' undeclared (first use this function)
+act.wizard.c:661: `buf1' undeclared (first use this function)
+act.wizard.c: In function `do_stat':
+act.wizard.c:814: `buf1' undeclared (first use this function)
+act.wizard.c:814: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_shutdown':
+act.wizard.c:893: `arg' undeclared (first use this function)
+act.wizard.c:896: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_snoop':
+act.wizard.c:942: `arg' undeclared (first use this function)
+act.wizard.c: In function `do_switch':
+act.wizard.c:982: `arg' undeclared (first use this function)
+act.wizard.c: In function `do_load':
+act.wizard.c:1034: `buf' undeclared (first use this function)
+act.wizard.c:1034: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_vstat':
+act.wizard.c:1078: `buf' undeclared (first use this function)
+act.wizard.c:1078: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_purge':
+act.wizard.c:1118: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_advance':
+act.wizard.c:1170: `arg' undeclared (first use this function)
+act.wizard.c:1170: `buf2' undeclared (first use this function)
+act.wizard.c:1201: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_restore':
+act.wizard.c:1251: `buf' undeclared (first use this function)
+act.wizard.c: In function `perform_immort_invis':
+act.wizard.c:1317: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_invis':
+act.wizard.c:1331: `arg' undeclared (first use this function)
+act.wizard.c: In function `do_gecho':
+act.wizard.c:1358: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_dc':
+act.wizard.c:1400: `arg' undeclared (first use this function)
+act.wizard.c:1416: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_wizlock':
+act.wizard.c:1429: `arg' undeclared (first use this function)
+act.wizard.c:1443: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_date':
+act.wizard.c:1473: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_last':
+act.wizard.c:1494: `arg' undeclared (first use this function)
+act.wizard.c:1507: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_force':
+act.wizard.c:1521: `arg' undeclared (first use this function)
+act.wizard.c:1523: `buf1' undeclared (first use this function)
+act.wizard.c:1535: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_wiznet':
+act.wizard.c:1589: `buf1' undeclared (first use this function)
+act.wizard.c:1653: `buf2' undeclared (first use this function)
+act.wizard.c: In function `do_zreset':
+act.wizard.c:1687: `arg' undeclared (first use this function)
+act.wizard.c:1696: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_wizutil':
+act.wizard.c:1729: `arg' undeclared (first use this function)
+act.wizard.c:1744: `buf' undeclared (first use this function)
+act.wizard.c: In function `do_show':
+act.wizard.c:1881: `buf' undeclared (first use this function)
+act.wizard.c:1892: `arg' undeclared (first use this function)
+act.wizard.c: In function `do_set':
+act.wizard.c:2113: `buf' undeclared (first use this function)
+act.wizard.c:2464: warning: left-hand operand of comma expression has no effect
+act.wizard.c:2470: warning: left-hand operand of comma expression has no effect
+act.wizard.c: In function `do_syslog':
+act.wizard.c:2492: `arg' undeclared (first use this function)
+act.wizard.c:2497: `buf' undeclared (first use this function)
+make[1]: *** [act.wizard.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  ban.c
+ban.c: In function `do_ban':
+ban.c:129: `buf' undeclared (first use this function)
+ban.c:129: (Each undeclared identifier is reported only once
+ban.c:129: for each function it appears in.)
+ban.c: In function `do_unban':
+ban.c:228: `buf' undeclared (first use this function)
+make[1]: *** [ban.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  castle.c
+castle.c: In function `tom':
+castle.c:580: `arg' undeclared (first use this function)
+castle.c:580: (Each undeclared identifier is reported only once
+castle.c:580: for each function it appears in.)
+castle.c: In function `tim':
+castle.c:608: `arg' undeclared (first use this function)
+castle.c: In function `DicknDavid':
+castle.c:682: `arg' undeclared (first use this function)
+make[1]: *** [castle.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  class.c
+class.c: In function `advance_level':
+class.c:403: `buf' undeclared (first use this function)
+class.c:403: (Each undeclared identifier is reported only once
+class.c:403: for each function it appears in.)
+make[1]: *** [class.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  db.c
+db.c: In function `do_reboot':
+db.c:146: `arg' undeclared (first use this function)
+db.c:146: (Each undeclared identifier is reported only once
+db.c:146: for each function it appears in.)
+db.c: In function `boot_db':
+db.c:309: `buf2' undeclared (first use this function)
+db.c: In function `reset_time':
+db.c:347: `buf' undeclared (first use this function)
+db.c: In function `build_player_index':
+db.c:399: `buf' undeclared (first use this function)
+db.c: In function `index_boot':
+db.c:479: `buf2' undeclared (first use this function)
+db.c:482: `buf1' undeclared (first use this function)
+db.c: In function `parse_room':
+db.c:658: `buf2' undeclared (first use this function)
+db.c:692: `buf' undeclared (first use this function)
+db.c: In function `setup_dir':
+db.c:733: `buf2' undeclared (first use this function)
+db.c: In function `parse_mobile':
+db.c:1031: `buf2' undeclared (first use this function)
+db.c: In function `parse_object':
+db.c:1102: `buf2' undeclared (first use this function)
+db.c: In function `load_zones':
+db.c:1233: `buf2' undeclared (first use this function)
+db.c: In function `vnum_mobile':
+db.c:1367: `buf' undeclared (first use this function)
+db.c: In function `vnum_object':
+db.c:1385: `buf' undeclared (first use this function)
+db.c: In function `read_mobile':
+db.c:1417: `buf' undeclared (first use this function)
+db.c: In function `read_object':
+db.c:1475: `buf' undeclared (first use this function)
+db.c: In function `get_id_by_name':
+db.c:1746: `arg' undeclared (first use this function)
+make[1]: *** [db.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  fight.c
+fight.c: In function `load_messages':
+fight.c:94: `buf2' undeclared (first use this function)
+fight.c:94: (Each undeclared identifier is reported only once
+fight.c:94: for each function it appears in.)
+fight.c: In function `make_corpse':
+fight.c:235: `buf2' undeclared (first use this function)
+fight.c: In function `perform_group_gain':
+fight.c:345: `buf2' undeclared (first use this function)
+fight.c: In function `damage':
+fight.c:700: `buf2' undeclared (first use this function)
+make[1]: *** [fight.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  graph.c
+graph.c: In function `do_track':
+graph.c:165: `arg' undeclared (first use this function)
+graph.c:165: (Each undeclared identifier is reported only once
+graph.c:165: for each function it appears in.)
+graph.c:188: `buf' undeclared (first use this function)
+graph.c: In function `hunt_victim':
+graph.c:229: `buf' undeclared (first use this function)
+make[1]: *** [graph.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  handler.c
+handler.c: In function `equip_char':
+handler.c:475: `buf' undeclared (first use this function)
+handler.c:475: (Each undeclared identifier is reported only once
+handler.c:475: for each function it appears in.)
+make[1]: *** [handler.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  house.c
+house.c:54: warning: #warning House_load: doesnt release_buffer()
+house.c:152: warning: #warning House_delete_file: doesnt release_buffer()
+house.c:177: warning: #warning House_listrent: doesnt release_buffer()
+house.c:310: warning: #warning hcontrol_list_houses: doesnt release_buffer()
+house.c:360: warning: #warning hcontrol_build_house: doesnt release_buffer()
+house.c:513: warning: #warning do_hcontrol: doesnt release_buffer()
+house.c: In function `hcontrol_list_houses':
+house.c:320: `buf' undeclared (first use this function)
+house.c:320: (Each undeclared identifier is reported only once
+house.c:320: for each function it appears in.)
+house.c:347: `buf2' undeclared (first use this function)
+house.c:348: warning: left-hand operand of comma expression has no effect
+house.c: In function `hcontrol_build_house':
+house.c:394: `buf' undeclared (first use this function)
+house.c: In function `hcontrol_pay_house':
+house.c:500: `buf' undeclared (first use this function)
+house.c: In function `do_house':
+house.c:538: `arg' undeclared (first use this function)
+house.c:552: `buf' undeclared (first use this function)
+house.c:553: warning: left-hand operand of comma expression has no effect
+make[1]: *** [house.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  interpreter.c
+interpreter.c: In function `command_interpreter':
+interpreter.c:585: `arg' undeclared (first use this function)
+interpreter.c:585: (Each undeclared identifier is reported only once
+interpreter.c:585: for each function it appears in.)
+interpreter.c: In function `do_alias':
+interpreter.c:671: `arg' undeclared (first use this function)
+interpreter.c:679: `buf' undeclared (first use this function)
+interpreter.c: In function `perform_complex_alias':
+interpreter.c:731: `buf2' undeclared (first use this function)
+interpreter.c:738: `buf' undeclared (first use this function)
+interpreter.c:727: warning: `write_point' might be used uninitialized in this function
+interpreter.c: In function `perform_dupe_check':
+interpreter.c:1220: `buf' undeclared (first use this function)
+make[1]: *** [interpreter.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  limits.c
+limits.c: In function `gain_exp_regardless':
+limits.c:295: `buf' undeclared (first use this function)
+limits.c:295: (Each undeclared identifier is reported only once
+limits.c:295: for each function it appears in.)
+limits.c: In function `check_idling':
+limits.c:369: `buf' undeclared (first use this function)
+make[1]: *** [limits.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  magic.c
+magic.c: In function `mag_unaffects':
+magic.c:974: `buf' undeclared (first use this function)
+magic.c:974: (Each undeclared identifier is reported only once
+magic.c:974: for each function it appears in.)
+magic.c: In function `mag_creations':
+magic.c:1086: `buf' undeclared (first use this function)
+make[1]: *** [magic.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  mobact.c
+mobact.c: In function `mobile_activity':
+mobact.c:51: `buf' undeclared (first use this function)
+mobact.c:51: (Each undeclared identifier is reported only once
+mobact.c:51: for each function it appears in.)
+make[1]: *** [mobact.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  objsave.c
+objsave.c:230: warning: #warning Crash_listrent: doesnt release_buffer()
+objsave.c: In function `Crash_delete_file':
+objsave.c:104: `buf1' undeclared (first use this function)
+objsave.c:104: (Each undeclared identifier is reported only once
+objsave.c:104: for each function it appears in.)
+objsave.c: In function `Crash_delete_crashfile':
+objsave.c:135: `buf1' undeclared (first use this function)
+objsave.c: In function `Crash_clean_file':
+objsave.c:171: `buf1' undeclared (first use this function)
+objsave.c:200: `buf' undeclared (first use this function)
+objsave.c: In function `Crash_load':
+objsave.c:320: `buf1' undeclared (first use this function)
+objsave.c:326: `buf' undeclared (first use this function)
+objsave.c: In function `Crash_rent_deadline':
+objsave.c:708: `buf' undeclared (first use this function)
+objsave.c: In function `gen_receptionist':
+objsave.c:853: `buf' undeclared (first use this function)
+make[1]: *** [objsave.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  olc.c
+olc.c: In function `do_olc':
+olc.c:86: `buf' undeclared (first use this function)
+olc.c:86: (Each undeclared identifier is reported only once
+olc.c:86: for each function it appears in.)
+olc.c:110: `arg' undeclared (first use this function)
+olc.c:73: warning: `vnum' might be used uninitialized in this function
+olc.c: In function `olc_interpreter':
+olc.c:198: `buf' undeclared (first use this function)
+olc.c: In function `olc_string':
+olc.c:298: `buf' undeclared (first use this function)
+olc.c: In function `olc_bitvector':
+olc.c:338: `buf' undeclared (first use this function)
+olc.c:358: `buf2' undeclared (first use this function)
+olc.c:323: warning: `this_name' might be used uninitialized in this function
+make[1]: *** [olc.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  shop.c
+shop.c:174: warning: #warning evaluate_expression and down: doesnt release_buffer()
+shop.c: In function `transaction_amt':
+shop.c:299: `buf' undeclared (first use this function)
+shop.c:299: (Each undeclared identifier is reported only once
+shop.c:299: for each function it appears in.)
+shop.c: In function `shop_keeper':
+shop.c:834: `arg' undeclared (first use this function)
+shop.c: In function `end_read_list':
+shop.c:912: `buf' undeclared (first use this function)
+shop.c: In function `read_line':
+shop.c:923: `buf' undeclared (first use this function)
+shop.c: In function `read_type_list':
+shop.c:958: `buf' undeclared (first use this function)
+shop.c: In function `list_all_shops':
+shop.c:1105: `buf' undeclared (first use this function)
+shop.c:1111: `buf2' undeclared (first use this function)
+shop.c:1114: `buf1' undeclared (first use this function)
+shop.c: In function `list_detailed_shop':
+shop.c:1145: `buf' undeclared (first use this function)
+shop.c:1154: `buf1' undeclared (first use this function)
+make[1]: *** [shop.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  spec_assign.c
+spec_assign.c: In function `ASSIGNMOB':
+spec_assign.c:32: `buf' undeclared (first use this function)
+spec_assign.c:32: (Each undeclared identifier is reported only once
+spec_assign.c:32: for each function it appears in.)
+spec_assign.c: In function `ASSIGNOBJ':
+spec_assign.c:43: `buf' undeclared (first use this function)
+spec_assign.c: In function `ASSIGNROOM':
+spec_assign.c:54: `buf' undeclared (first use this function)
+make[1]: *** [spec_assign.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  spec_procs.c
+spec_procs.c:617: warning: #warning pet_shops and down: doesnt release_buffer()
+spec_procs.c: In function `list_skills':
+spec_procs.c:121: `buf' undeclared (first use this function)
+spec_procs.c:121: (Each undeclared identifier is reported only once
+spec_procs.c:121: for each function it appears in.)
+spec_procs.c:128: `buf2' undeclared (first use this function)
+spec_procs.c: In function `guild':
+spec_procs.c:171: `buf' undeclared (first use this function)
+spec_procs.c: In function `bank':
+spec_procs.c:690: `buf' undeclared (first use this function)
+make[1]: *** [spec_procs.o] Error 1
+gcc -c -g -O -Wall -fno-strict-prototypes  spell_parser.c
+spell_parser.c: In function `say_spell':
+spell_parser.c:219: `buf' undeclared (first use this function)
+spell_parser.c:219: (Each undeclared identifier is reported only once
+spell_parser.c:219: for each function it appears in.)
+spell_parser.c:242: `buf1' undeclared (first use this function)
+spell_parser.c:243: `buf2' undeclared (first use this function)
+spell_parser.c: In function `mag_objectmagic':
+spell_parser.c:426: `arg' undeclared (first use this function)
+spell_parser.c: In function `do_cast':
+spell_parser.c:655: `arg' undeclared (first use this function)
+spell_parser.c:706: `buf' undeclared (first use this function)
+make[1]: *** [spell_parser.o] Error 1
diff -uprN -x *.o ../stk/fight.c ./fight.c
--- ../stk/fight.c	Thu Jun 19 00:58:37 1997
+++ ./fight.c	Sat Aug 16 23:02:39 1997
@@ -88,9 +88,10 @@ void load_messages(void)
   FILE *fl;
   int i, type;
   struct message_type *messages;
-  char chk[128];
+  char *chk = get_buffer(128);
 
   if (!(fl = fopen(MESS_FILE, "r"))) {
+    char *buf2 = get_buffer(SMALL_BUFSIZE);
     sprintf(buf2, "Error reading combat message file %s", MESS_FILE);
     perror(buf2);
     exit(1);
@@ -112,7 +113,7 @@ void load_messages(void)
     for (i = 0; (i < MAX_MESSAGES) && (fight_messages[i].a_type != type) &&
 	 (fight_messages[i].a_type); i++);
     if (i >= MAX_MESSAGES) {
-      fprintf(stderr, "Too many combat messages.  Increase MAX_MESSAGES and recompile.");
+      log("Too many combat messages.  Increase MAX_MESSAGES and recompile.");
       exit(1);
     }
     CREATE(messages, struct message_type, 1);
@@ -137,7 +138,7 @@ void load_messages(void)
     while (!feof(fl) && (*chk == '\n' || *chk == '*'))
       fgets(chk, 128, fl);
   }
-
+  release_buffer(chk);
   fclose(fl);
 }
 
@@ -165,13 +166,14 @@ void check_killer(struct char_data * ch,
   if (!PLR_FLAGGED(vict, PLR_KILLER) && !PLR_FLAGGED(vict, PLR_THIEF)
       && !PLR_FLAGGED(ch, PLR_KILLER) && !IS_NPC(ch) && !IS_NPC(vict) &&
       (ch != vict)) {
-    char buf[256];
+    char *buf = get_buffer(256);
 
     SET_BIT(PLR_FLAGS(ch), PLR_KILLER);
     sprintf(buf, "PC Killer bit set on %s for initiating attack on %s at %s.",
 	    GET_NAME(ch), GET_NAME(vict), world[vict->in_room].name);
     mudlog(buf, BRF, LVL_IMMORT, TRUE);
     send_to_char("If you want to be a PLAYER KILLER, so be it...\r\n", ch);
+    release_buffer(buf);
   }
 }
 
@@ -222,7 +224,7 @@ void make_corpse(struct char_data * ch)
   struct obj_data *money;
   int i;
   extern int max_npc_corpse_time, max_pc_corpse_time;
-
+  char *buf2 = get_buffer(SMALL_BUFSIZE);
   struct obj_data *create_money(int amount);
 
   corpse = create_obj();
@@ -274,6 +276,7 @@ void make_corpse(struct char_data * ch)
   IS_CARRYING_W(ch) = 0;
 
   obj_to_room(corpse, ch->in_room);
+  release_buffer(buf2);
 }
 
 
@@ -341,8 +344,10 @@ void perform_group_gain(struct char_data
   share = MIN(max_exp_gain, MAX(1, base));
 
   if (share > 1) {
+    char *buf2 = get_buffer(SMALL_BUFSIZE);
     sprintf(buf2, "You receive your share of experience -- %d points.\r\n", share);
     send_to_char(buf2, ch);
+    release_buffer(buf2);
   } else
     send_to_char("You receive your share of experience -- one measly little point!\r\n", ch);
 
@@ -587,6 +592,7 @@ void damage(struct char_data * ch, struc
 	    int attacktype)
 {
   int exp;
+  char *buf2;
 
   if (GET_POS(victim) <= POS_DEAD) {
     log("SYSERR: Attempt to damage a corpse.");
@@ -696,9 +702,11 @@ void damage(struct char_data * ch, struc
       act("That really did HURT!", FALSE, victim, 0, 0, TO_CHAR);
 
     if (GET_HIT(victim) < (GET_MAX_HIT(victim) >> 2)) {
+      buf2 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf2, "%sYou wish that your wounds would stop BLEEDING so much!%s\r\n",
 	      CCRED(victim, C_SPR), CCNRM(victim, C_SPR));
       send_to_char(buf2, victim);
+      release_buffer(buf2);
       if (MOB_FLAGGED(victim, MOB_WIMPY) && (ch != victim))
 	do_flee(victim, "", 0, 0);
     }
@@ -737,17 +745,21 @@ void damage(struct char_data * ch, struc
 	  exp += MAX(0, (exp * MIN(8, (GET_LEVEL(victim) - GET_LEVEL(ch)))) >> 3);
 	exp = MAX(exp, 1);
 	if (exp > 1) {
+	  buf2 = get_buffer(SMALL_BUFSIZE);
 	  sprintf(buf2, "You receive %d experience points.\r\n", exp);
 	  send_to_char(buf2, ch);
+	  release_buffer(buf2);
 	} else
 	  send_to_char("You receive one lousy experience point.\r\n", ch);
 	gain_exp(ch, exp);
 	change_alignment(ch, victim);
       }
     if (!IS_NPC(victim)) {
+      buf2 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf2, "%s killed by %s at %s", GET_NAME(victim), GET_NAME(ch),
 	      world[victim->in_room].name);
       mudlog(buf2, BRF, LVL_IMMORT, TRUE);
+      release_buffer(buf2);
       if (MOB_FLAGGED(ch, MOB_MEMORY))
 	forget(ch, victim);
     }
diff -uprN -x *.o ../stk/graph.c ./graph.c
--- ../stk/graph.c	Thu Jun 26 12:01:39 1997
+++ ./graph.c	Sat Aug 16 23:14:42 1997
@@ -157,48 +157,50 @@ ACMD(do_track)
 {
   struct char_data *vict;
   int dir, num;
+  char *arg;
 
   if (!GET_SKILL(ch, SKILL_TRACK)) {
     send_to_char("You have no idea how.\r\n", ch);
     return;
   }
+
+  arg = get_buffer(MAX_INPUT_LENGTH);
   one_argument(argument, arg);
-  if (!*arg) {
+  if (!*arg)
     send_to_char("Whom are you trying to track?\r\n", ch);
-    return;
-  }
-  if (!(vict = get_char_vis(ch, arg))) {
+  else if (!(vict = get_char_vis(ch, arg)))
     send_to_char("No-one around by that name.\r\n", ch);
-    return;
-  }
-  if (IS_AFFECTED(vict, AFF_NOTRACK)) {
+  else if (IS_AFFECTED(vict, AFF_NOTRACK))
     send_to_char("You sense no trail.\r\n", ch);
-    return;
-  }
-  dir = find_first_step(ch->in_room, vict->in_room);
-
-  switch (dir) {
-  case BFS_ERROR:
-    send_to_char("Hmm.. something seems to be wrong.\r\n", ch);
-    break;
-  case BFS_ALREADY_THERE:
-    send_to_char("You're already in the same room!!\r\n", ch);
-    break;
-  case BFS_NO_PATH:
-    sprintf(buf, "You can't sense a trail to %s from here.\r\n",
+  else {
+    char *buf = get_buffer(SMALL_BUFSIZE);
+    dir = find_first_step(ch->in_room, vict->in_room);
+
+    switch (dir) {
+    case BFS_ERROR:
+      send_to_char("Hmm.. something seems to be wrong.\r\n", ch);
+      break;
+    case BFS_ALREADY_THERE:
+      send_to_char("You're already in the same room!!\r\n", ch);
+      break;
+    case BFS_NO_PATH:
+      sprintf(buf, "You can't sense a trail to %s from here.\r\n",
 	    HMHR(vict));
-    send_to_char(buf, ch);
-    break;
-  default:
-    num = number(0, 101);	/* 101% is a complete failure */
-    if (GET_SKILL(ch, SKILL_TRACK) < num)
-      do {
-	dir = number(0, NUM_OF_DIRS - 1);
-      } while (!CAN_GO(ch, dir));
-    sprintf(buf, "You sense a trail %s from here!\r\n", dirs[dir]);
-    send_to_char(buf, ch);
-    break;
+      send_to_char(buf, ch);
+      break;
+    default:
+      num = number(0, 101);	/* 101% is a complete failure */
+      if (GET_SKILL(ch, SKILL_TRACK) < num)
+        do {
+	  dir = number(0, NUM_OF_DIRS - 1);
+        } while (!CAN_GO(ch, dir));
+      sprintf(buf, "You sense a trail %s from here!\r\n", dirs[dir]);
+      send_to_char(buf, ch);
+      break;
+    }
+    release_buffer(buf);
   }
+  release_buffer(arg);
 }
 
 
@@ -226,9 +228,11 @@ void hunt_victim(struct char_data * ch)
   }
   dir = find_first_step(ch->in_room, HUNTING(ch)->in_room);
   if (dir < 0) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Damn!  Lost %s!", HMHR(HUNTING(ch)));
     do_say(ch, buf, 0, 0);
-    HUNTING(ch) = 0;
+    release_buffer(buf);
+    HUNTING(ch) = NULL;
     return;
   } else {
     perform_move(ch, dir, 1);
diff -uprN -x *.o ../stk/handler.c ./handler.c
--- ../stk/handler.c	Thu Jun 19 00:58:37 1997
+++ ./handler.c	Sat Aug 16 23:15:12 1997
@@ -38,8 +38,8 @@ void clearMemory(struct char_data * ch);
 
 char *fname(char *namelist)
 {
-  static char holder[30];
   register char *point;
+  static char holder[30];
 
   for (point = holder; isalpha(*namelist); namelist++, point++)
     *point = *namelist;
@@ -472,9 +472,11 @@ void equip_char(struct char_data * ch, s
   assert(pos >= 0 && pos < NUM_WEARS);
 
   if (GET_EQ(ch, pos)) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "SYSERR: Char is already equipped: %s, %s", GET_NAME(ch),
 	    obj->short_description);
     log(buf);
+    release_buffer(buf);
     return;
   }
   if (obj->carried_by) {
@@ -559,7 +561,7 @@ int get_number(char **name)
 {
   int i;
   char *ppos;
-  char number[MAX_INPUT_LENGTH];
+  char *number = get_buffer(MAX_INPUT_LENGTH);
 
   *number = '\0';
 
@@ -572,8 +574,11 @@ int get_number(char **name)
       if (!isdigit(*(number + i)))
 	return 0;
 
-    return (atoi(number));
+    i = (atoi(number));
+    release_buffer(number);
+    return i;
   }
+  release_buffer(number);
   return 1;
 }
 
@@ -612,8 +617,7 @@ struct char_data *get_char_room(char *na
 {
   struct char_data *i;
   int j = 0, number;
-  char tmpname[MAX_INPUT_LENGTH];
-  char *tmp = tmpname;
+  char *tmp = get_buffer(MAX_INPUT_LENGTH);
 
   strcpy(tmp, name);
   if (!(number = get_number(&tmp)))
@@ -621,9 +625,12 @@ struct char_data *get_char_room(char *na
 
   for (i = world[room].people; i && (j <= number); i = i->next_in_room)
     if (isname(tmp, i->player.name))
-      if (++j == number)
+      if (++j == number) {
+        release_buffer(tmp);
 	return i;
+      }
 
+  release_buffer(tmp);
   return NULL;
 }
 
@@ -919,24 +926,30 @@ struct char_data *get_char_room_vis(stru
 {
   struct char_data *i;
   int j = 0, number;
-  char tmpname[MAX_INPUT_LENGTH];
-  char *tmp = tmpname;
+  char *tmp;
 
   /* JE 7/18/94 :-) :-) */
   if (!str_cmp(name, "self") || !str_cmp(name, "me"))
     return ch;
 
   /* 0.<name> means PC with name */
+  tmp = get_buffer(MAX_INPUT_LENGTH);
   strcpy(tmp, name);
-  if (!(number = get_number(&tmp)))
-    return get_player_vis(ch, tmp, 1);
+  if (!(number = get_number(&tmp))) {
+    i = get_player_vis(ch, tmp, 1);
+    release_buffer(tmp);
+    return i;
+  }
 
   for (i = world[ch->in_room].people; i && j <= number; i = i->next_in_room)
     if (isname(tmp, i->player.name))
       if (CAN_SEE(ch, i))
-	if (++j == number)
+	if (++j == number) {
+          release_buffer(tmp);
 	  return i;
+        }
 
+  release_buffer(tmp);
   return NULL;
 }
 
@@ -945,22 +958,28 @@ struct char_data *get_char_vis(struct ch
 {
   struct char_data *i;
   int j = 0, number;
-  char tmpname[MAX_INPUT_LENGTH];
-  char *tmp = tmpname;
+  char *tmp;
 
   /* check the room first */
   if ((i = get_char_room_vis(ch, name)) != NULL)
     return i;
 
+  tmp = get_buffer(MAX_INPUT_LENGTH);
   strcpy(tmp, name);
-  if (!(number = get_number(&tmp)))
-    return get_player_vis(ch, tmp, 0);
+  if (!(number = get_number(&tmp))) {
+    i = get_player_vis(ch, tmp, 0);
+    release_buffer(tmp);
+    return i;
+  }
 
   for (i = character_list; i && (j <= number); i = i->next)
     if (isname(tmp, i->player.name) && CAN_SEE(ch, i))
-      if (++j == number)
+      if (++j == number) {
+        release_buffer(tmp);
 	return i;
+      }
 
+  release_buffer(tmp);
   return NULL;
 }
 
@@ -971,19 +990,23 @@ struct obj_data *get_obj_in_list_vis(str
 {
   struct obj_data *i;
   int j = 0, number;
-  char tmpname[MAX_INPUT_LENGTH];
-  char *tmp = tmpname;
+  char *tmp = get_buffer(MAX_INPUT_LENGTH);
 
   strcpy(tmp, name);
-  if (!(number = get_number(&tmp)))
+  if (!(number = get_number(&tmp))) {
+    release_buffer(tmp);
     return NULL;
+  }
 
   for (i = list; i && (j <= number); i = i->next_content)
     if (isname(tmp, i->name))
       if (CAN_SEE_OBJ(ch, i))
-	if (++j == number)
+	if (++j == number) {
+          release_buffer(tmp);
 	  return i;
+	}
 
+  release_buffer(tmp);
   return NULL;
 }
 
@@ -995,8 +1018,7 @@ struct obj_data *get_obj_vis(struct char
 {
   struct obj_data *i;
   int j = 0, number;
-  char tmpname[MAX_INPUT_LENGTH];
-  char *tmp = tmpname;
+  char *tmp;
 
   /* scan items carried */
   if ((i = get_obj_in_list_vis(ch, name, ch->carrying)))
@@ -1006,17 +1028,23 @@ struct obj_data *get_obj_vis(struct char
   if ((i = get_obj_in_list_vis(ch, name, world[ch->in_room].contents)))
     return i;
 
+  tmp = get_buffer(MAX_INPUT_LENGTH);
   strcpy(tmp, name);
-  if (!(number = get_number(&tmp)))
+  if (!(number = get_number(&tmp))) {
+    release_buffer(tmp);
     return NULL;
+  }
 
   /* ok.. no luck yet. scan the entire obj list   */
   for (i = object_list; i && (j <= number); i = i->next)
     if (isname(tmp, i->name))
       if (CAN_SEE_OBJ(ch, i))
-	if (++j == number)
+	if (++j == number) {
+	  release_buffer(tmp);
 	  return i;
+	}
 
+  release_buffer(tmp);
   return NULL;
 }
 
@@ -1037,42 +1065,42 @@ struct obj_data *get_object_in_equip_vis
 
 char *money_desc(int amount)
 {
-  static char buf[128];
+  static char *buf;
 
   if (amount <= 0) {
     log("SYSERR: Try to create negative or 0 money.");
     return NULL;
   }
   if (amount == 1)
-    strcpy(buf, "a gold coin");
+    buf = "a gold coin";
   else if (amount <= 10)
-    strcpy(buf, "a tiny pile of gold coins");
+    buf = "a tiny pile of gold coins";
   else if (amount <= 20)
-    strcpy(buf, "a handful of gold coins");
+    buf = "a handful of gold coins";
   else if (amount <= 75)
-    strcpy(buf, "a little pile of gold coins");
+    buf = "a little pile of gold coins";
   else if (amount <= 200)
-    strcpy(buf, "a small pile of gold coins");
+    buf = "a small pile of gold coins";
   else if (amount <= 1000)
-    strcpy(buf, "a pile of gold coins");
+    buf = "a pile of gold coins";
   else if (amount <= 5000)
-    strcpy(buf, "a big pile of gold coins");
+    buf = "a big pile of gold coins";
   else if (amount <= 10000)
-    strcpy(buf, "a large heap of gold coins");
+    buf = "a large heap of gold coins";
   else if (amount <= 20000)
-    strcpy(buf, "a huge mound of gold coins");
+    buf = "a huge mound of gold coins";
   else if (amount <= 75000)
-    strcpy(buf, "an enormous mound of gold coins");
+    buf = "an enormous mound of gold coins";
   else if (amount <= 150000)
-    strcpy(buf, "a small mountain of gold coins");
+    buf = "a small mountain of gold coins";
   else if (amount <= 250000)
-    strcpy(buf, "a mountain of gold coins");
+    buf = "a mountain of gold coins";
   else if (amount <= 500000)
-    strcpy(buf, "a huge mountain of gold coins");
+    buf = "a huge mountain of gold coins";
   else if (amount <= 1000000)
-    strcpy(buf, "an enormous mountain of gold coins");
+    buf = "an enormous mountain of gold coins";
   else
-    strcpy(buf, "an absolutely colossal mountain of gold coins");
+    buf = "an absolutely colossal mountain of gold coins";
 
   return buf;
 }
@@ -1082,7 +1110,7 @@ struct obj_data *create_money(int amount
 {
   struct obj_data *obj;
   struct extra_descr_data *new_descr;
-  char buf[200];
+  char *buf;
 
   if (amount <= 0) {
     log("SYSERR: Try to create negative or 0 money.");
@@ -1100,6 +1128,7 @@ struct obj_data *create_money(int amount
   } else {
     obj->name = str_dup("coins gold");
     obj->short_description = str_dup(money_desc(amount));
+    buf = get_buffer(200);
     sprintf(buf, "%s is lying here.", money_desc(amount));
     obj->description = str_dup(CAP(buf));
 
@@ -1119,6 +1148,8 @@ struct obj_data *create_money(int amount
       new_descr->description = str_dup(buf);
     } else
       new_descr->description = str_dup("There are a LOT of coins.");
+
+    release_buffer(buf);
   }
 
   new_descr->next = NULL;
@@ -1152,23 +1183,27 @@ int generic_find(char *arg, int bitvecto
 		     struct char_data ** tar_ch, struct obj_data ** tar_obj)
 {
   int i, found;
-  char name[256];
+  char *name = get_buffer(256);
 
   one_argument(arg, name);
 
-  if (!*name)
+  if (!*name) {
+    release_buffer(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))) {
+      release_buffer(name);
       return (FIND_CHAR_ROOM);
     }
   }
   if (IS_SET(bitvector, FIND_CHAR_WORLD)) {
     if ((*tar_ch = get_char_vis(ch, name))) {
+      release_buffer(name);
       return (FIND_CHAR_WORLD);
     }
   }
@@ -1179,24 +1214,29 @@ int generic_find(char *arg, int bitvecto
 	found = TRUE;
       }
     if (found) {
+      release_buffer(name);
       return (FIND_OBJ_EQUIP);
     }
   }
   if (IS_SET(bitvector, FIND_OBJ_INV)) {
     if ((*tar_obj = get_obj_in_list_vis(ch, name, ch->carrying))) {
+      release_buffer(name);
       return (FIND_OBJ_INV);
     }
   }
   if (IS_SET(bitvector, FIND_OBJ_ROOM)) {
     if ((*tar_obj = get_obj_in_list_vis(ch, name, world[ch->in_room].contents))) {
+      release_buffer(name);
       return (FIND_OBJ_ROOM);
     }
   }
   if (IS_SET(bitvector, FIND_OBJ_WORLD)) {
     if ((*tar_obj = get_obj_vis(ch, name))) {
+      release_buffer(name);
       return (FIND_OBJ_WORLD);
     }
   }
+  release_buffer(name);
   return (0);
 }
 
diff -uprN -x *.o ../stk/house.c ./house.c
--- ../stk/house.c	Thu Jun 19 00:58:37 1997
+++ ./house.c	Sat Aug 16 23:20:00 1997
@@ -14,11 +14,11 @@
 
 
 #include "structs.h"
+#include "utils.h"
 #include "comm.h"
 #include "handler.h"
 #include "db.h"
 #include "interpreter.h"
-#include "utils.h"
 #include "house.h"
 
 extern char *dirs[];
@@ -51,8 +51,9 @@ int House_get_filename(int vnum, char *f
 /* Load all objects for a house */
 int House_load(int vnum)
 {
+#warning House_load: doesnt release_buffer()
   FILE *fl;
-  char fname[MAX_STRING_LENGTH];
+  char *fname = get_buffer(MAX_STRING_LENGTH);
   struct obj_file_elem object;
   int rnum;
 
@@ -118,21 +119,27 @@ void House_restore_weight(struct obj_dat
 void House_crashsave(int vnum)
 {
   int rnum;
-  char buf[MAX_STRING_LENGTH];
+  char *buf;
   FILE *fp;
 
   if ((rnum = real_room(vnum)) == -1)
     return;
-  if (!House_get_filename(vnum, buf))
+  buf = get_buffer(MAX_STRING_LENGTH);
+  if (!House_get_filename(vnum, buf)) {
+    release_buffer(buf);
     return;
+  }
   if (!(fp = fopen(buf, "wb"))) {
     perror("SYSERR: Error saving house file");
+    release_buffer(buf);
     return;
   }
   if (!House_save(world[rnum].contents, fp)) {
     fclose(fp);
+    release_buffer(buf);
     return;
   }
+  release_buffer(buf);
   fclose(fp);
   House_restore_weight(world[rnum].contents);
   REMOVE_BIT(ROOM_FLAGS(rnum), ROOM_HOUSE_CRASH);
@@ -142,7 +149,9 @@ void House_crashsave(int vnum)
 /* Delete a house save file */
 void House_delete_file(int vnum)
 {
-  char buf[MAX_INPUT_LENGTH], fname[MAX_INPUT_LENGTH];
+#warning House_delete_file: doesnt release_buffer()
+  char *buf = get_buffer(MAX_INPUT_LENGTH),
+	*fname = get_buffer(MAX_INPUT_LENGTH);
   FILE *fl;
 
   if (!House_get_filename(vnum, fname))
@@ -165,9 +174,10 @@ void House_delete_file(int vnum)
 /* List all objects in a house file */
 void House_listrent(struct char_data * ch, int vnum)
 {
+#warning House_listrent: doesnt release_buffer()
   FILE *fl;
-  char fname[MAX_STRING_LENGTH];
-  char buf[MAX_STRING_LENGTH];
+  char *fname = get_buffer(MAX_STRING_LENGTH);
+  char *buf = get_buffer(MAX_STRING_LENGTH);
   struct obj_file_elem object;
   struct obj_data *obj;
 
@@ -297,9 +307,14 @@ char *HCONTROL_FORMAT =
 
 void hcontrol_list_houses(struct char_data * ch)
 {
+#warning hcontrol_list_houses: doesnt release_buffer()
   int i, j;
-  char *timestr, *temp;
-  char built_on[128], last_pay[128], own_name[128];
+  char *timestr,
+	*temp,
+	*built_on = get_buffer(128),
+	*last_pay = get_buffer(128),
+	*own_name = get_buffer(128),
+	*buf = get_buffer(MAX_STRING_LENGTH);
 
   if (!num_of_houses) {
     send_to_char("No houses have been defined.\r\n", ch);
@@ -332,8 +347,8 @@ void hcontrol_list_houses(struct char_da
     if (house_control[i].num_of_guests) {
       strcat(buf, "     Guests: ");
       for (j = 0; j < house_control[i].num_of_guests; j++) {
-	sprintf(buf2, "%s ", NAME(house_control[i].guests[j]));
-	strcat(buf, CAP(buf2));
+	sprintf(own_name, "%s ", NAME(house_control[i].guests[j]));
+	strcat(buf, CAP(own_name));
       }
       strcat(buf, "\r\n");
     }
@@ -345,7 +360,8 @@ void hcontrol_list_houses(struct char_da
 
 void hcontrol_build_house(struct char_data * ch, char *arg)
 {
-  char arg1[MAX_INPUT_LENGTH];
+#warning hcontrol_build_house: doesnt release_buffer()
+  char *arg1 = get_buffer(MAX_INPUT_LENGTH);
   struct house_control_rec temp_house;
   sh_int virt_house, real_house, real_atrium, virt_atrium, exit_num;
   long owner;
@@ -378,14 +394,18 @@ void hcontrol_build_house(struct char_da
     return;
   }
   if ((exit_num = search_block(arg1, dirs, FALSE)) < 0) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "'%s' is not a valid direction.\r\n", arg1);
     send_to_char(buf, ch);
+    release_buffer(buf);
     return;
   }
   if (TOROOM(real_house, exit_num) == NOWHERE) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "There is no exit %s from room %d.\r\n", dirs[exit_num],
 	    virt_house);
     send_to_char(buf, ch);
+    release_buffer(buf);
     return;
   }
 
@@ -404,8 +424,10 @@ void hcontrol_build_house(struct char_da
     return;
   }
   if ((owner = get_id_by_name(arg1)) < 0) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Unknown player '%s'.\r\n", arg1);
     send_to_char(buf, ch);
+    release_buffer(buf);
     return;
   }
 
@@ -484,8 +506,10 @@ void hcontrol_pay_house(struct char_data
   else if ((i = find_house(atoi(arg))) < 0)
     send_to_char("Unknown house.\r\n", ch);
   else {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Payment for house %s collected by %s.", arg, GET_NAME(ch));
     mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+    release_buffer(buf);
 
     house_control[i].last_payment = time(0);
     House_save_control();
@@ -497,7 +521,9 @@ void hcontrol_pay_house(struct char_data
 /* The hcontrol command itself, used by imms to create/destroy houses */
 ACMD(do_hcontrol)
 {
-  char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
+#warning do_hcontrol: doesnt release_buffer()
+  char *arg1 = get_buffer(MAX_INPUT_LENGTH),
+	*arg2 = get_buffer(MAX_INPUT_LENGTH);
 
   half_chop(argument, arg1, arg2);
 
@@ -518,7 +544,8 @@ ACMD(do_hcontrol)
 ACMD(do_house)
 {
   int i, j, id;
-  char *temp;
+  char *temp, *arg = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_STRING_LENGTH);
 
   one_argument(argument, arg);
 
@@ -547,6 +574,8 @@ ACMD(do_house)
 	house_control[i].num_of_guests--;
 	House_save_control();
 	send_to_char("Guest deleted.\r\n", ch);
+	release_buffer(buf);
+	release_buffer(arg);
 	return;
       }
     j = house_control[i].num_of_guests++;
@@ -554,6 +583,8 @@ ACMD(do_house)
     House_save_control();
     send_to_char("Guest added.\r\n", ch);
   }
+  release_buffer(buf);
+  release_buffer(arg);
 }
 
 
diff -uprN -x *.o ../stk/interpreter.c ./interpreter.c
--- ../stk/interpreter.c	Thu Jun 19 00:58:37 1997
+++ ./interpreter.c	Sat Aug 16 23:28:42 1997
@@ -15,10 +15,10 @@
 
 
 #include "structs.h"
+#include "utils.h"
 #include "comm.h"
 #include "interpreter.h"
 #include "db.h"
-#include "utils.h"
 #include "spells.h"
 #include "handler.h"
 #include "mail.h"
@@ -567,7 +567,7 @@ void command_interpreter(struct char_dat
 {
   int cmd, length;
   extern int no_specials;
-  char *line;
+  char *line, *arg;
 
   REMOVE_BIT(AFF_FLAGS(ch), AFF_HIDE);
 
@@ -581,6 +581,7 @@ void command_interpreter(struct char_dat
    * requested by many people so "'hi" or ";godnet test" is possible.
    * Patch sent by Eric Green and Stefan Wasilewski.
    */
+  arg = get_buffer(MAX_INPUT_LENGTH);
   if (!isalpha(*argument)) {
     arg[0] = argument[0];
     arg[1] = '\0';
@@ -594,6 +595,7 @@ void command_interpreter(struct char_dat
       if (GET_LEVEL(ch) >= cmd_info[cmd].minimum_level)
 	break;
 
+  release_buffer(arg);
   if (*cmd_info[cmd].command == '\n')
     send_to_char("Huh?!?\r\n", ch);
   else if (PLR_FLAGGED(ch, PLR_FROZEN) && GET_LEVEL(ch) < LVL_IMPL)
@@ -662,12 +664,13 @@ void free_alias(struct alias *a)
 /* The interface to the outside world: do_alias */
 ACMD(do_alias)
 {
-  char *repl;
+  char *repl, *arg;
   struct alias *a, *temp;
 
   if (IS_NPC(ch))
     return;
 
+  arg = get_buffer(MAX_INPUT_LENGTH);
   repl = any_one_arg(argument, arg);
 
   if (!*arg) {			/* no argument specified -- list currently defined aliases */
@@ -676,8 +679,10 @@ ACMD(do_alias)
       send_to_char(" None.\r\n", ch);
     else {
       while (a != NULL) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "%-15s %s\r\n", a->alias, a->replacement);
 	send_to_char(buf, ch);
+	release_buffer(buf);
 	a = a->next;
       }
     }
@@ -693,11 +698,9 @@ ACMD(do_alias)
 	send_to_char("No such alias.\r\n", ch);
       else
 	send_to_char("Alias deleted.\r\n", ch);
-    } else {			/* otherwise, either add or redefine an alias */
-      if (!str_cmp(arg, "alias")) {
-	send_to_char("You can't alias 'alias'.\r\n", ch);
-	return;
-      }
+    } else if (!str_cmp(arg, "alias"))
+      send_to_char("You can't alias 'alias'.\r\n", ch);
+    else {		/* otherwise, either add or redefine an alias */
       CREATE(a, struct alias, 1);
       a->alias = str_dup(arg);
       delete_doubledollar(repl);
@@ -711,6 +714,7 @@ ACMD(do_alias)
       send_to_char("Alias added.\r\n", ch);
     }
   }
+  release_buffer(arg);
 }
 
 /*
@@ -724,7 +728,9 @@ ACMD(do_alias)
 void perform_complex_alias(struct txt_q *input_q, char *orig, struct alias *a)
 {
   struct txt_q temp_queue;
-  char *tokens[NUM_TOKENS], *temp, *write_point;
+  char *tokens[NUM_TOKENS], *temp, *write_point,
+	*buf2 = get_buffer(MAX_STRING_LENGTH),
+	*buf = get_buffer(MAX_STRING_LENGTH);
   int num_of_tokens = 0, num;
 
   /* First, parse the original string */
@@ -770,6 +776,9 @@ void perform_complex_alias(struct txt_q 
     temp_queue.tail->next = input_q->head;
     input_q->head = temp_queue.head;
   }
+
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
@@ -783,7 +792,7 @@ void perform_complex_alias(struct txt_q 
  */
 int perform_alias(struct descriptor_data *d, char *orig)
 {
-  char first_arg[MAX_INPUT_LENGTH], *ptr;
+  char *first_arg, *ptr;
   struct alias *a, *tmp;
 
   /* bail out immediately if the guy doesn't have any aliases */
@@ -791,15 +800,21 @@ int perform_alias(struct descriptor_data
     return 0;
 
   /* find the alias we're supposed to match */
+  first_arg = get_buffer(MAX_INPUT_LENGTH);
   ptr = any_one_arg(orig, first_arg);
 
   /* bail out if it's null */
-  if (!*first_arg)
+  if (!*first_arg) {
+    release_buffer(first_arg);
     return 0;
+  }
 
   /* if the first arg is not an alias, return without doing anything */
-  if ((a = find_alias(tmp, first_arg)) == NULL)
+  if ((a = find_alias(tmp, first_arg)) == NULL) {
+    release_buffer(first_arg);
     return 0;
+  }
+  release_buffer(first_arg);
 
   if (a->type == ALIAS_SIMPLE) {
     strcpy(orig, a->replacement);
@@ -1115,6 +1130,7 @@ int perform_dupe_check(struct descriptor
 {
   struct descriptor_data *k, *next_k;
   struct char_data *target = NULL, *ch, *next_ch;
+  char *buf;
   int mode = 0;
 
   int id = GET_IDNUM(d->character);
@@ -1207,6 +1223,7 @@ int perform_dupe_check(struct descriptor
   REMOVE_BIT(PLR_FLAGS(d->character), PLR_MAILING | PLR_WRITING);
   STATE(d) = CON_PLAYING;
 
+  buf = get_buffer(SMALL_BUFSIZE);
   switch (mode) {
   case RECON:
     SEND_TO_Q("Reconnecting.\r\n", d);
@@ -1230,6 +1247,7 @@ int perform_dupe_check(struct descriptor
     break;
   }
 
+  release_buffer(buf);
   return 1;
 }
 
@@ -1238,9 +1256,8 @@ int perform_dupe_check(struct descriptor
 /* deal with newcomers and other non-playing sockets */
 void nanny(struct descriptor_data *d, char *arg)
 {
-  char buf[128];
+  char *buf, *tmp_name;
   int player_i, load_result;
-  char tmp_name[MAX_INPUT_LENGTH];
   struct char_file_u tmp_store;
   extern sh_int r_mortal_start_room;
   extern sh_int r_immort_start_room;
@@ -1265,11 +1282,15 @@ void nanny(struct descriptor_data *d, ch
     if (!*arg)
       close_socket(d);
     else {
+      buf = get_buffer(128);
+      tmp_name = get_buffer(MAX_INPUT_LENGTH);
       if ((_parse_name(arg, tmp_name)) || strlen(tmp_name) < 2 ||
 	  strlen(tmp_name) > MAX_NAME_LENGTH ||
 	  fill_word(strcpy(buf, tmp_name)) || reserved_word(buf)) {
 	SEND_TO_Q("Invalid name, please try another.\r\n"
 		  "Name: ", d);
+        release_buffer(buf);
+        release_buffer(tmp_name);
 	return;
       }
       if ((player_i = load_char(tmp_name, &tmp_store)) > -1) {
@@ -1304,6 +1325,8 @@ void nanny(struct descriptor_data *d, ch
 	if (!Valid_Name(tmp_name)) {
 	  SEND_TO_Q("Invalid name, please try another.\r\n", d);
 	  SEND_TO_Q("Name: ", d);
+          release_buffer(buf);
+          release_buffer(tmp_name);
 	  return;
 	}
 	CREATE(d->character->player.name, char, strlen(tmp_name) + 1);
@@ -1318,24 +1341,30 @@ void nanny(struct descriptor_data *d, ch
   case CON_NAME_CNFRM:		/* wait for conf. of new name    */
     if (UPPER(*arg) == 'Y') {
       if (isbanned(d->host) >= BAN_NEW) {
+        buf = get_buffer(128);
 	sprintf(buf, "Request for new char %s denied from [%s] (siteban)",
 		GET_NAME(d->character), d->host);
 	mudlog(buf, NRM, LVL_GOD, TRUE);
 	SEND_TO_Q("Sorry, new characters are not allowed from your site!\r\n", d);
 	STATE(d) = CON_CLOSE;
+        release_buffer(buf);
 	return;
       }
       if (restrict) {
 	SEND_TO_Q("Sorry, new players can't be created at the moment.\r\n", d);
+        buf = get_buffer(128);
 	sprintf(buf, "Request for new char %s denied from %s (wizlock)",
 		GET_NAME(d->character), d->host);
 	mudlog(buf, NRM, LVL_GOD, TRUE);
 	STATE(d) = CON_CLOSE;
+        release_buffer(buf);
 	return;
       }
+      buf = get_buffer(128);
       SEND_TO_Q("New character.\r\n", d);
       sprintf(buf, "Give me a password for %s: ", GET_NAME(d->character));
       SEND_TO_Q(buf, d);
+      release_buffer(buf);
       echo_off(d);
       STATE(d) = CON_NEWPASSWD;
     } else if (*arg == 'n' || *arg == 'N') {
@@ -1364,6 +1393,7 @@ void nanny(struct descriptor_data *d, ch
       close_socket(d);
     else {
       if (strncmp(CRYPT(arg, GET_PASSWD(d->character)), GET_PASSWD(d->character), MAX_PWD_LENGTH)) {
+        buf = get_buffer(128);
 	sprintf(buf, "Bad PW: %s [%s]", GET_NAME(d->character), d->host);
 	mudlog(buf, BRF, LVL_GOD, TRUE);
 	GET_BAD_PWS(d->character)++;
@@ -1375,6 +1405,7 @@ void nanny(struct descriptor_data *d, ch
 	  SEND_TO_Q("Wrong password.\r\nPassword: ", d);
 	  echo_off(d);
 	}
+        release_buffer(buf);
 	return;
       }
       load_result = GET_BAD_PWS(d->character);
@@ -1384,37 +1415,45 @@ void nanny(struct descriptor_data *d, ch
 	  !PLR_FLAGGED(d->character, PLR_SITEOK)) {
 	SEND_TO_Q("Sorry, this char has not been cleared for login from your site!\r\n", d);
 	STATE(d) = CON_CLOSE;
+        buf = get_buffer(128);
 	sprintf(buf, "Connection attempt for %s denied from %s",
 		GET_NAME(d->character), d->host);
 	mudlog(buf, NRM, LVL_GOD, TRUE);
+        release_buffer(buf);
 	return;
       }
       if (GET_LEVEL(d->character) < restrict) {
 	SEND_TO_Q("The game is temporarily restricted.. try again later.\r\n", d);
 	STATE(d) = CON_CLOSE;
+        buf = get_buffer(128);
 	sprintf(buf, "Request for login denied for %s [%s] (wizlock)",
 		GET_NAME(d->character), d->host);
 	mudlog(buf, NRM, LVL_GOD, TRUE);
+        release_buffer(buf);
 	return;
       }
       /* check and make sure no other copies of this player are logged in */
       if (perform_dupe_check(d))
-	return;
+   	return;
 
       if (GET_LEVEL(d->character) >= LVL_IMMORT)
 	SEND_TO_Q(imotd, d);
       else
 	SEND_TO_Q(motd, d);
 
+      buf = get_buffer(128);
       sprintf(buf, "%s [%s] has connected.", GET_NAME(d->character), d->host);
       mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(d->character)), TRUE);
+      release_buffer(buf);
 
       if (load_result) {
+        buf = get_buffer(128);
 	sprintf(buf, "\r\n\r\n\007\007\007"
 		"%s%d LOGIN FAILURE%s SINCE LAST SUCCESSFUL LOGIN.%s\r\n",
 		CCRED(d->character, C_SPR), load_result,
 		(load_result > 1) ? "S" : "", CCNRM(d->character, C_SPR));
 	SEND_TO_Q(buf, d);
+        release_buffer(buf);
 	GET_BAD_PWS(d->character) = 0;
       }
       SEND_TO_Q("\r\n\n*** PRESS RETURN: ", d);
@@ -1506,8 +1545,10 @@ void nanny(struct descriptor_data *d, ch
     SEND_TO_Q("\r\n\n*** PRESS RETURN: ", d);
     STATE(d) = CON_RMOTD;
 
+    buf = get_buffer(128);
     sprintf(buf, "%s [%s] new player.", GET_NAME(d->character), d->host);
     mudlog(buf, NRM, LVL_IMMORT, TRUE);
+    release_buffer(buf);
     break;
 
   case CON_RMOTD:		/* read CR after printing motd   */
@@ -1645,12 +1686,14 @@ void nanny(struct descriptor_data *d, ch
 	SET_BIT(PLR_FLAGS(d->character), PLR_DELETED);
       save_char(d->character, NOWHERE);
       Crash_delete_file(GET_NAME(d->character));
+      buf = get_buffer(128);
       sprintf(buf, "Character '%s' deleted!\r\n"
 	      "Goodbye.\r\n", GET_NAME(d->character));
       SEND_TO_Q(buf, d);
       sprintf(buf, "%s (lev %d) has self-deleted.", GET_NAME(d->character),
 	      GET_LEVEL(d->character));
       mudlog(buf, NRM, LVL_GOD, TRUE);
+      release_buffer(buf);
       STATE(d) = CON_CLOSE;
       return;
     } else {
diff -uprN -x *.o ../stk/limits.c ./limits.c
--- ../stk/limits.c	Thu Jun 19 00:58:37 1997
+++ ./limits.c	Sat Aug 16 23:29:40 1997
@@ -209,7 +209,7 @@ void set_title(struct char_data * ch, ch
 
 void check_autowiz(struct char_data * ch)
 {
-  char buf[100];
+  char *buf = get_buffer(100);
   extern int use_autowiz;
   extern int min_wizlist_lev;
   pid_t getpid(void);
@@ -220,6 +220,7 @@ void check_autowiz(struct char_data * ch
     mudlog("Initiating autowiz.", CMP, LVL_IMMORT, FALSE);
     system(buf);
   }
+  release_buffer(buf);
 }
 
 
@@ -228,7 +229,7 @@ void gain_exp(struct char_data * ch, int
 {
   int is_altered = FALSE;
   int num_levels = 0;
-  char buf[128];
+  char *buf;
 
   if (!IS_NPC(ch) && ((GET_LEVEL(ch) < 1 || GET_LEVEL(ch) >= LVL_IMMORT)))
     return;
@@ -252,8 +253,10 @@ void gain_exp(struct char_data * ch, int
       if (num_levels == 1)
         send_to_char("You rise a level!\r\n", ch);
       else {
+        buf = get_buffer(128);
 	sprintf(buf, "You rise %d levels!\r\n", num_levels);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       }
       set_title(ch, NULL);
       check_autowiz(ch);
@@ -289,8 +292,10 @@ void gain_exp_regardless(struct char_dat
       if (num_levels == 1)
         send_to_char("You rise a level!\r\n", ch);
       else {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "You rise %d levels!\r\n", num_levels);
 	send_to_char(buf, ch);
+	release_buffer(buf);
       }
       set_title(ch, NULL);
       check_autowiz(ch);
@@ -353,6 +358,7 @@ void check_idling(struct char_data * ch)
       char_from_room(ch);
       char_to_room(ch, 1);
     } else if (ch->char_specials.timer > 48) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       if (ch->in_room != NOWHERE)
 	char_from_room(ch);
       char_to_room(ch, 3);
@@ -365,6 +371,7 @@ void check_idling(struct char_data * ch)
 	Crash_idlesave(ch);
       sprintf(buf, "%s force-rented and extracted (idle).", GET_NAME(ch));
       mudlog(buf, CMP, LVL_GOD, TRUE);
+      release_buffer(buf);
       extract_char(ch);
     }
 }
diff -uprN -x *.o ../stk/magic.c ./magic.c
--- ../stk/magic.c	Thu Jun 19 00:58:37 1997
+++ ./magic.c	Sat Aug 16 23:30:45 1997
@@ -949,7 +949,7 @@ void mag_unaffects(int level, struct cha
 		        int spellnum, int type)
 {
   int spell = 0;
-  char *to_vict = NULL, *to_room = NULL;
+  char *to_vict = NULL, *to_room = NULL, *buf;
 
   if (victim == NULL)
     return;
@@ -971,8 +971,10 @@ void mag_unaffects(int level, struct cha
     to_vict = "You don't feel so unlucky.";
     break;
   default:
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "SYSERR: unknown spellnum %d passed to mag_unaffects", spellnum);
     log(buf);
+    release_buffer(buf);
     return;
     break;
   }
@@ -1082,10 +1084,12 @@ void mag_creations(int level, struct cha
   }
 
   if (!(tobj = read_object(z, VIRTUAL))) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     send_to_char("I seem to have goofed.\r\n", ch);
     sprintf(buf, "SYSERR: spell_creations, spell %d, obj %d: obj not found",
 	    spellnum, z);
     log(buf);
+    release_buffer(buf);
     return;
   }
   obj_to_char(tobj, ch);
diff -uprN -x *.o ../stk/mail.c ./mail.c
--- ../stk/mail.c	Thu Jun 19 00:58:37 1997
+++ ./mail.c	Mon Jul 28 19:02:09 1997
@@ -163,7 +163,7 @@ int scan_file(void)
   FILE *mail_file;
   header_block_type next_block;
   int total_messages = 0, block_num = 0;
-  char buf[100];
+  char *buf;
 
   if (!(mail_file = fopen(MAIL_FILE, "r"))) {
     log("Mail file non-existant... creating new file.");
@@ -180,6 +180,7 @@ int scan_file(void)
     block_num++;
   }
 
+  buf = get_buffer(100);
   file_end_pos = ftell(mail_file);
   fclose(mail_file);
   sprintf(buf, "   %ld bytes read.", file_end_pos);
@@ -187,10 +188,12 @@ int scan_file(void)
   if (file_end_pos % BLOCK_SIZE) {
     log("SYSERR: Error booting mail system -- Mail file corrupt!");
     log("SYSERR: Mail disabled!");
+    release_buffer(buf);
     return 0;
   }
   sprintf(buf, "   Mail file read -- %d messages.", total_messages);
   log(buf);
+  release_buffer(buf);
   return 1;
 }				/* end of scan_file */
 
@@ -315,7 +318,7 @@ char *read_delete(long recipient)
   mail_index_type *mail_pointer, *prev_mail;
   position_list_type *position_pointer;
   long mail_address, following_block;
-  char *message, *tmstr, buf[200];
+  char *message, *tmstr, *buf;
   size_t string_size;
 
   if (recipient < 0) {
@@ -367,6 +370,7 @@ char *read_delete(long recipient)
   tmstr = asctime(localtime(&header.header_data.mail_time));
   *(tmstr + strlen(tmstr) - 1) = '\0';
 
+  buf = get_buffer(200);
   sprintf(buf, " * * * * Midgaard Mail System * * * *\r\n"
 	  "Date: %s\r\n"
 	  "  To: %s\r\n"
@@ -399,6 +403,7 @@ char *read_delete(long recipient)
     push_free_list(mail_address);
   }
 
+  release_buffer(buf);
   return message;
 }
 
@@ -439,12 +444,13 @@ void postmaster_send_mail(struct char_da
 			  int cmd, char *arg)
 {
   long recipient;
-  char buf[256];
+  char *buf = get_buffer(256);
 
   if (GET_LEVEL(ch) < MIN_MAIL_LEVEL) {
     sprintf(buf, "$n tells you, 'Sorry, you have to be level %d to send mail!'",
 	    MIN_MAIL_LEVEL);
     act(buf, FALSE, mailman, 0, ch, TO_VICT);
+    release_buffer(buf);
     return;
   }
   one_argument(arg, buf);
@@ -452,17 +458,20 @@ void postmaster_send_mail(struct char_da
   if (!*buf) {			/* you'll get no argument from me! */
     act("$n tells you, 'You need to specify an addressee!'",
 	FALSE, mailman, 0, ch, TO_VICT);
+    release_buffer(buf);
     return;
   }
   if (GET_GOLD(ch) < STAMP_PRICE) {
     sprintf(buf, "$n tells you, 'A stamp costs %d coins.'\r\n"
 	    "$n tells you, '...which I see you can't afford.'", STAMP_PRICE);
     act(buf, FALSE, mailman, 0, ch, TO_VICT);
+    release_buffer(buf);
     return;
   }
   if ((recipient = get_id_by_name(buf)) < 0) {
     act("$n tells you, 'No one by that name is registered here!'",
 	FALSE, mailman, 0, ch, TO_VICT);
+    release_buffer(buf);
     return;
   }
   act("$n starts to write some mail.", TRUE, ch, 0, 0, TO_ROOM);
@@ -478,31 +487,36 @@ void postmaster_send_mail(struct char_da
   ch->desc->str = (char **) malloc(sizeof(char *));
   *(ch->desc->str) = NULL;
   ch->desc->max_str = MAX_MAIL_SIZE;
+
+  release_buffer(buf);
 }
 
 
 void postmaster_check_mail(struct char_data * ch, struct char_data *mailman,
 			  int cmd, char *arg)
 {
-  char buf[256];
+  char *buf = get_buffer(256);
 
   if (has_mail(GET_IDNUM(ch)))
-    sprintf(buf, "$n tells you, 'You have mail waiting.'");
+    strcpy(buf, "$n tells you, 'You have mail waiting.'");
   else
-    sprintf(buf, "$n tells you, 'Sorry, you don't have any mail waiting.'");
+    strcpy(buf, "$n tells you, 'Sorry, you don't have any mail waiting.'");
   act(buf, FALSE, mailman, 0, ch, TO_VICT);
+
+  release_buffer(buf);
 }
 
 
 void postmaster_receive_mail(struct char_data * ch, struct char_data *mailman,
 			  int cmd, char *arg)
 {
-  char buf[256];
+  char *buf = get_buffer(256);
   struct obj_data *obj;
 
   if (!has_mail(GET_IDNUM(ch))) {
     sprintf(buf, "$n tells you, 'Sorry, you don't have any mail waiting.'");
     act(buf, FALSE, mailman, 0, ch, TO_VICT);
+    release_buffer(buf);
     return;
   }
   while (has_mail(GET_IDNUM(ch))) {
@@ -528,4 +542,5 @@ void postmaster_receive_mail(struct char
     act("$n gives you a piece of mail.", FALSE, mailman, 0, ch, TO_VICT);
     act("$N gives $n a piece of mail.", FALSE, ch, 0, mailman, TO_ROOM);
   }
+  release_buffer(buf);
 }
diff -uprN -x *.o ../stk/mobact.c ./mobact.c
--- ../stk/mobact.c	Thu Jun 19 00:58:37 1997
+++ ./mobact.c	Sat Aug 16 23:31:11 1997
@@ -48,9 +48,11 @@ void mobile_activity(void)
     /* Examine call for special procedure */
     if (MOB_FLAGGED(ch, MOB_SPEC) && !no_specials) {
       if (mob_index[GET_MOB_RNUM(ch)].func == NULL) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "%s (#%d): Attempting to call non-existing mob func",
 		GET_NAME(ch), GET_MOB_VNUM(ch));
 	log(buf);
+	release_buffer(buf);
 	REMOVE_BIT(MOB_FLAGS(ch), MOB_SPEC);
       } else {
 	if ((mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, ""))
diff -uprN -x *.o ../stk/modify.c ./modify.c
--- ../stk/modify.c	Thu Jun 19 00:58:38 1997
+++ ./modify.c	Sun Aug  3 18:52:31 1997
@@ -122,9 +122,11 @@ void string_add(struct descriptor_data *
 
 ACMD(do_skillset)
 {
+#warning do_skillset: doesnt release_buffer()
   extern char *spells[];
   struct char_data *vict;
-  char name[100], buf2[100], buf[100], help[MAX_STRING_LENGTH];
+  char *help = get_buffer(MAX_STRING_LENGTH), *buf = get_buffer(100),
+	*name = get_buffer(100), *buf2 = get_buffer(100);
   int skill, value, i, qend;
 
   argument = one_argument(argument, name);
@@ -318,7 +320,7 @@ void page_string(struct descriptor_data 
 /* The call that displays the next page. */
 void show_string(struct descriptor_data *d, char *input)
 {
-  char buffer[MAX_STRING_LENGTH];
+  char *buf = get_buffer(MAX_STRING_LENGTH);
   int diff;
 
   one_argument(input, buf);
@@ -331,6 +333,7 @@ void show_string(struct descriptor_data 
       free(d->showstr_head);
       d->showstr_head = 0;
     }
+    release_buffer(buf);
     return;
   }
   /* R is for refresh, so back up one page internally so we can display
@@ -355,8 +358,11 @@ void show_string(struct descriptor_data 
     send_to_char(
 		  "Valid commands while paging are RETURN, Q, R, B, or a numeric value.\r\n",
 		  d->character);
+    release_buffer(buf);
     return;
   }
+  release_buffer(buf);
+
   /* If we're displaying the last page, just send it to the character, and
    * then free up the space we used.
    */
@@ -371,11 +377,13 @@ void show_string(struct descriptor_data 
   }
   /* Or if we have more to show.... */
   else {
+    char *buffer = get_buffer(MAX_STRING_LENGTH);
     strncpy(buffer, d->showstr_vector[d->showstr_page],
 	    diff = ((int) d->showstr_vector[d->showstr_page + 1])
 	    - ((int) d->showstr_vector[d->showstr_page]));
     buffer[diff] = '\0';
     send_to_char(buffer, d->character);
+    release_buffer(buffer);
     d->showstr_page++;
   }
 }
diff -uprN -x *.o ../stk/objsave.c ./objsave.c
--- ../stk/objsave.c	Thu Jun 19 00:58:38 1997
+++ ./objsave.c	Sat Aug 16 23:39:21 1997
@@ -92,45 +92,59 @@ int Obj_to_store(struct obj_data * obj, 
 
 int Crash_delete_file(char *name)
 {
-  char filename[50];
+  char *filename = get_buffer(50);
   FILE *fl;
 
-  if (!get_filename(name, filename, CRASH_FILE))
+  if (!get_filename(name, filename, CRASH_FILE)) {
+    release_buffer(filename);
     return 0;
+  }
   if (!(fl = fopen(filename, "rb"))) {
     if (errno != ENOENT) {	/* if it fails but NOT because of no file */
+      char *buf1 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf1, "SYSERR: deleting crash file %s (1)", filename);
       perror(buf1);
+      release_buffer(buf1);
     }
+    release_buffer(filename);
     return 0;
   }
   fclose(fl);
 
   if (unlink(filename) < 0) {
     if (errno != ENOENT) {	/* if it fails, NOT because of no file */
+      char *buf1 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf1, "SYSERR: deleting crash file %s (2)", filename);
       perror(buf1);
+      release_buffer(buf1);
     }
   }
+  release_buffer(filename);
   return (1);
 }
 
 
 int Crash_delete_crashfile(struct char_data * ch)
 {
-  char fname[MAX_INPUT_LENGTH];
+  char *fname = get_buffer(MAX_INPUT_LENGTH);
   struct rent_info rent;
   FILE *fl;
 
-  if (!get_filename(GET_NAME(ch), fname, CRASH_FILE))
+  if (!get_filename(GET_NAME(ch), fname, CRASH_FILE)) {
+    release_buffer(fname);
     return 0;
+  }
   if (!(fl = fopen(fname, "rb"))) {
     if (errno != ENOENT) {	/* if it fails, NOT because of no file */
+      char *buf1 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf1, "SYSERR: checking for crash file %s (3)", fname);
       perror(buf1);
+      release_buffer(buf1);
     }
+    release_buffer(fname);
     return 0;
   }
+  release_buffer(fname);
   if (!feof(fl))
     fread(&rent, sizeof(struct rent_info), 1, fl);
   fclose(fl);
@@ -144,27 +158,34 @@ int Crash_delete_crashfile(struct char_d
 
 int Crash_clean_file(char *name)
 {
-  char fname[MAX_STRING_LENGTH], filetype[20];
+  char *fname = get_buffer(MAX_STRING_LENGTH), *filetype, *buf;
   struct rent_info rent;
   extern int rent_file_timeout, crash_file_timeout;
   FILE *fl;
 
-  if (!get_filename(name, fname, CRASH_FILE))
+  if (!get_filename(name, fname, CRASH_FILE)) {
+    release_buffer(fname);
     return 0;
+  }
+
   /*
    * open for write so that permission problems will be flagged now, at boot
    * time.
    */
   if (!(fl = fopen(fname, "r+b"))) {
     if (errno != ENOENT) {	/* if it fails, NOT because of no file */
+      char *buf1 = get_buffer(SMALL_BUFSIZE);
       sprintf(buf1, "SYSERR: OPENING OBJECT FILE %s (4)", fname);
       perror(buf1);
+      release_buffer(buf1);
     }
+    release_buffer(fname);
     return 0;
   }
   if (!feof(fl))
     fread(&rent, sizeof(struct rent_info), 1, fl);
   fclose(fl);
+  release_buffer(fname);
 
   if ((rent.rentcode == RENT_CRASH) ||
       (rent.rentcode == RENT_FORCED) || (rent.rentcode == RENT_TIMEDOUT)) {
@@ -172,28 +193,32 @@ int Crash_clean_file(char *name)
       Crash_delete_file(name);
       switch (rent.rentcode) {
       case RENT_CRASH:
-	strcpy(filetype, "crash");
+	filetype = "crash";
 	break;
       case RENT_FORCED:
-	strcpy(filetype, "forced rent");
+	filetype = "forced rent";
 	break;
       case RENT_TIMEDOUT:
-	strcpy(filetype, "idlesave");
+	filetype = "idlesave";
 	break;
       default:
-	strcpy(filetype, "UNKNOWN!");
+	filetype = "UNKNOWN!";
 	break;
       }
+      buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "    Deleting %s's %s file.", name, filetype);
       log(buf);
+      release_buffer(buf);
       return 1;
     }
     /* Must retrieve rented items w/in 30 days */
   } else if (rent.rentcode == RENT_RENTED)
     if (rent.time < time(0) - (rent_file_timeout * SECS_PER_REAL_DAY)) {
       Crash_delete_file(name);
+      buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "    Deleting %s's rent file.", name);
       log(buf);
+      release_buffer(buf);
       return 1;
     }
   return (0);
@@ -214,8 +239,10 @@ void update_obj_file(void)
 
 void Crash_listrent(struct char_data * ch, char *name)
 {
+#warning Crash_listrent: doesnt release_buffer()
   FILE *fl;
-  char fname[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
+  char *fname = get_buffer(MAX_INPUT_LENGTH),
+	*buf = get_buffer(MAX_STRING_LENGTH);
   struct obj_file_elem object;
   struct obj_data *obj;
   struct rent_info rent;
@@ -290,26 +317,32 @@ int Crash_load(struct char_data * ch)
   void Crash_crashsave(struct char_data * ch);
 
   FILE *fl;
-  char fname[MAX_STRING_LENGTH];
+  char *fname = get_buffer(MAX_STRING_LENGTH), *buf;
   struct obj_file_elem object;
   struct rent_info rent;
   int cost, orig_rent_code;
   float num_of_days;
 
-  if (!get_filename(GET_NAME(ch), fname, CRASH_FILE))
+  if (!get_filename(GET_NAME(ch), fname, CRASH_FILE)) {
+    release_buffer(fname);
     return 1;
+  }
   if (!(fl = fopen(fname, "r+b"))) {
+    buf = get_buffer(SMALL_BUFSIZE);
     if (errno != ENOENT) {	/* if it fails, NOT because of no file */
-      sprintf(buf1, "SYSERR: READING OBJECT FILE %s (5)", fname);
-      perror(buf1);
+      sprintf(buf, "SYSERR: READING OBJECT FILE %s (5)", fname);
+      perror(buf);
       send_to_char("\r\n********************* NOTICE *********************\r\n"
 		   "There was a problem loading your objects from disk.\r\n"
 		   "Contact a God for assistance.\r\n", ch);
     }
     sprintf(buf, "%s entering game with no equipment.", GET_NAME(ch));
     mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+    release_buffer(buf);
+    release_buffer(fname);
     return 1;
   }
+  release_buffer(fname);
   if (!feof(fl))
     fread(&rent, sizeof(struct rent_info), 1, fl);
 
@@ -318,9 +351,11 @@ int Crash_load(struct char_data * ch)
     cost = (int) (rent.net_cost_per_diem * num_of_days);
     if (cost > GET_GOLD(ch) + GET_BANK_GOLD(ch)) {
       fclose(fl);
+      buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "%s entering game, rented equipment lost (no $).",
 	      GET_NAME(ch));
       mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+      release_buffer(buf);
       Crash_crashsave(ch);
       return 2;
     } else {
@@ -329,6 +364,7 @@ int Crash_load(struct char_data * ch)
       save_char(ch, NOWHERE);
     }
   }
+  buf = get_buffer(SMALL_BUFSIZE);
   switch (orig_rent_code = rent.rentcode) {
   case RENT_RENTED:
     sprintf(buf, "%s un-renting and entering game.", GET_NAME(ch));
@@ -352,6 +388,7 @@ int Crash_load(struct char_data * ch)
     mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
     break;
   }
+  release_buffer(buf);
 
   while (!feof(fl)) {
     fread(&object, sizeof(struct obj_file_elem), 1, fl);
@@ -471,7 +508,7 @@ void Crash_calculate_rent(struct obj_dat
 
 void Crash_crashsave(struct char_data * ch)
 {
-  char buf[MAX_INPUT_LENGTH];
+  char *buf;
   struct rent_info rent;
   int j;
   FILE *fp;
@@ -479,10 +516,16 @@ void Crash_crashsave(struct char_data * 
   if (IS_NPC(ch))
     return;
 
-  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE))
+  buf = get_buffer(MAX_INPUT_LENGTH);
+  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE)) {
+    release_buffer(buf);
     return;
-  if (!(fp = fopen(buf, "wb")))
+  }
+  if (!(fp = fopen(buf, "wb"))) {
+    release_buffer(buf);
     return;
+  }
+  release_buffer(buf);
 
   rent.rentcode = RENT_CRASH;
   rent.time = time(0);
@@ -511,7 +554,7 @@ void Crash_crashsave(struct char_data * 
 
 void Crash_idlesave(struct char_data * ch)
 {
-  char buf[MAX_INPUT_LENGTH];
+  char *buf;
   struct rent_info rent;
   int j;
   int cost;
@@ -520,10 +563,16 @@ void Crash_idlesave(struct char_data * c
   if (IS_NPC(ch))
     return;
 
-  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE))
+  buf = get_buffer(MAX_INPUT_LENGTH);
+  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE)) {
+    release_buffer(buf);
     return;
-  if (!(fp = fopen(buf, "wb")))
+  }
+  if (!(fp = fopen(buf, "wb"))) {
+    release_buffer(buf);
     return;
+  }
+  release_buffer(buf);
 
   for (j = 0; j < NUM_WEARS; j++)
     if (GET_EQ(ch, j))
@@ -568,7 +617,7 @@ void Crash_idlesave(struct char_data * c
 
 void Crash_rentsave(struct char_data * ch, int cost)
 {
-  char buf[MAX_INPUT_LENGTH];
+  char *buf;
   struct rent_info rent;
   int j;
   FILE *fp;
@@ -576,10 +625,16 @@ void Crash_rentsave(struct char_data * c
   if (IS_NPC(ch))
     return;
 
-  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE))
+  buf = get_buffer(MAX_INPUT_LENGTH);
+  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE)) {
+    release_buffer(buf);
     return;
-  if (!(fp = fopen(buf, "wb")))
+  }
+  if (!(fp = fopen(buf, "wb"))) {
+    release_buffer(buf);
     return;
+  }
+  release_buffer(buf);
 
   for (j = 0; j < NUM_WEARS; j++)
     if (GET_EQ(ch, j))
@@ -608,7 +663,7 @@ void Crash_rentsave(struct char_data * c
 
 void Crash_cryosave(struct char_data * ch, int cost)
 {
-  char buf[MAX_INPUT_LENGTH];
+  char *buf;
   struct rent_info rent;
   int j;
   FILE *fp;
@@ -616,10 +671,16 @@ void Crash_cryosave(struct char_data * c
   if (IS_NPC(ch))
     return;
 
-  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE))
+  buf = get_buffer(MAX_INPUT_LENGTH);
+  if (!get_filename(GET_NAME(ch), buf, CRASH_FILE)) {
+    release_buffer(buf);
     return;
-  if (!(fp = fopen(buf, "wb")))
+  }
+  if (!(fp = fopen(buf, "wb"))) {
+    release_buffer(buf);
     return;
+  }
+  release_buffer(buf);
 
   for (j = 0; j < NUM_WEARS; j++)
     if (GET_EQ(ch, j))
@@ -657,22 +718,25 @@ void Crash_rent_deadline(struct char_dat
 			      long cost)
 {
   long rent_deadline;
+  char *buf;
 
   if (!cost)
     return;
 
   rent_deadline = ((GET_GOLD(ch) + GET_BANK_GOLD(ch)) / cost);
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf,
       "$n tells you, 'You can rent for %ld day%s with the gold you have\r\n"
 	  "on hand and in the bank.'\r\n",
 	  rent_deadline, (rent_deadline > 1) ? "s" : "");
   act(buf, FALSE, recep, 0, ch, TO_VICT);
+  release_buffer(buf);
 }
 
 int Crash_report_unrentables(struct char_data * ch, struct char_data * recep,
 			         struct obj_data * obj)
 {
-  char buf[128];
+  char *buf = get_buffer(128);
   int has_norents = 0;
 
   if (obj) {
@@ -684,6 +748,7 @@ int Crash_report_unrentables(struct char
     has_norents += Crash_report_unrentables(ch, recep, obj->contains);
     has_norents += Crash_report_unrentables(ch, recep, obj->next_content);
   }
+  release_buffer(buf);
   return (has_norents);
 }
 
@@ -692,7 +757,7 @@ int Crash_report_unrentables(struct char
 void Crash_report_rent(struct char_data * ch, struct char_data * recep,
 		            struct obj_data * obj, long *cost, long *nitems, int display, int factor)
 {
-  static char buf[256];
+  char *buf = get_buffer(256);
 
   if (obj) {
     if (!Crash_is_unrentable(obj)) {
@@ -707,6 +772,7 @@ void Crash_report_rent(struct char_data 
     Crash_report_rent(ch, recep, obj->contains, cost, nitems, display, factor);
     Crash_report_rent(ch, recep, obj->next_content, cost, nitems, display, factor);
   }
+  release_buffer(buf);
 }
 
 
@@ -715,7 +781,7 @@ int Crash_offer_rent(struct char_data * 
 		         int display, int factor)
 {
   extern int max_obj_save;	/* change in config.c */
-  char buf[MAX_INPUT_LENGTH];
+  char *buf;
   int i;
   long totalcost = 0, numitems = 0, norent = 0;
 
@@ -738,19 +804,24 @@ int Crash_offer_rent(struct char_data * 
 	FALSE, receptionist, 0, ch, TO_VICT);
     return (0);
   }
+  buf = get_buffer(MAX_INPUT_LENGTH);
   if (numitems > max_obj_save) {
     sprintf(buf, "$n tells you, 'Sorry, but I cannot store more than %d items.'",
 	    max_obj_save);
     act(buf, FALSE, receptionist, 0, ch, TO_VICT);
+    release_buffer(buf);
     return (0);
   }
+  release_buffer(buf);
   if (display) {
+    buf = get_buffer(128);
     sprintf(buf, "$n tells you, 'Plus, my %d coin fee..'",
 	    min_rent_cost * factor);
     act(buf, FALSE, receptionist, 0, ch, TO_VICT);
     sprintf(buf, "$n tells you, 'For a total of %ld coins%s.'",
 	    totalcost, (factor == RENT_FACTOR ? " per day" : ""));
     act(buf, FALSE, receptionist, 0, ch, TO_VICT);
+    release_buffer(buf);
     if (totalcost > GET_GOLD(ch)) {
       act("$n tells you, '...which I see you can't afford.'",
 	  FALSE, receptionist, 0, ch, TO_VICT);
@@ -797,8 +868,10 @@ int gen_receptionist(struct char_data * 
     return 1;
   }
   if (CMD_IS("rent")) {
+    char *buf;
     if (!(cost = Crash_offer_rent(ch, recep, FALSE, mode)))
       return TRUE;
+    buf = get_buffer(SMALL_BUFSIZE);
     if (mode == RENT_FACTOR)
       sprintf(buf, "$n tells you, 'Rent will cost you %d gold coins per day.'", cost);
     else if (mode == CRYO_FACTOR)
@@ -807,6 +880,7 @@ int gen_receptionist(struct char_data * 
     if (cost > GET_GOLD(ch)) {
       act("$n tells you, '...which I see you can't afford.'",
 	  FALSE, recep, 0, ch, TO_VICT);
+      release_buffer(buf);
       return TRUE;
     }
     if (cost && (mode == RENT_FACTOR))
@@ -829,6 +903,7 @@ int gen_receptionist(struct char_data * 
     }
 
     mudlog(buf, NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
+    release_buffer(buf);
     act("$n helps $N into $S private chamber.", FALSE, recep, 0, ch, TO_NOTVICT);
     save_room = ch->in_room;
     extract_char(ch);
diff -uprN -x *.o ../stk/olc.c ./olc.c
--- ../stk/olc.c	Thu Jun 19 00:58:38 1997
+++ ./olc.c	Tue Aug 19 00:24:48 1997
@@ -69,7 +69,7 @@ char *olc_commands[] = {
 ACMD(do_olc)
 {
   void *olc_targ = NULL;
-  char mode_arg[MAX_INPUT_LENGTH];
+  char *mode_arg, *arg;
   int rnum, vnum, olc_mode;
 
   /* WARNING!  **DO NOT** under any circumstances remove the code below!!!!  */
@@ -80,44 +80,59 @@ ACMD(do_olc)
   /* WARNING!  **DO NOT** under any circumstances remove the code above!!!!  */
 
   /* first, figure out the first (mode) argument */
+  mode_arg = get_buffer(MAX_INPUT_LENGTH);
   half_chop(argument, mode_arg, argument);
   if ((olc_mode = search_block(mode_arg, olc_modes, FALSE)) < 0) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Invalid mode '%s'.\r\n", mode_arg);
     send_to_char(buf, ch);
+    release_buffer(buf);
     send_to_char(OLC_USAGE, ch);
+    release_buffer(mode_arg);
     return;
   }
   switch (olc_mode) {
   case OLC_SET:
   case OLC_SHOW:
     olc_set_show(ch, olc_mode, argument);
+    release_buffer(mode_arg);
     return;
     break;
   case OLC_REPEAT:
     if (!(olc_mode = GET_LAST_OLC_MODE(ch)) ||
 	((olc_targ = GET_LAST_OLC_TARG(ch)) == NULL)) {
       send_to_char("No last OLC operation!\r\n", ch);
+      release_buffer(mode_arg);
       return;
     }
     break;
   case OLC_ROOM:
     if (isdigit(*argument)) {
+      char *arg = get_buffer(MAX_INPUT_LENGTH);
       /* room specified.  take the numeric argument off */
       argument = one_argument(argument, arg);
       if ((vnum = atoi(arg)) < 0) {
+	char *buf = get_buffer(SMALL_BUFSIZE);
 	sprintf(buf, "Invalid room vnum '%s'.\r\n", arg);
 	send_to_char(buf, ch);
+	release_buffer(buf);
+	release_buffer(arg);
+        release_buffer(mode_arg);
 	return;
       }
+      release_buffer(arg);
       if ((rnum = real_room(vnum)) == NOWHERE) {
 	send_to_char("No such room!\r\n", ch);
+        release_buffer(mode_arg);
 	return;
       }
     } else {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       rnum = ch->in_room;
       vnum = world[ch->in_room].number;
       sprintf(buf, "(Using current room %d)\r\n", vnum);
       send_to_char(buf, ch);
+      release_buffer(buf);
     }
 
 /*   if (!ROOM_FLAGGED(rnum, ROOM_OLC))
@@ -127,36 +142,53 @@ ACMD(do_olc)
     olc_targ = (void *) &(world[rnum]);
     break;
   case OLC_MOB:
+    arg = get_buffer(MAX_INPUT_LENGTH);
     argument = one_argument(argument, arg);
     if ((vnum = atoi(arg)) < 0) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "Invalid mob vnum '%s'.\r\n", arg);
       send_to_char(buf, ch);
+      release_buffer(buf);
+      release_buffer(arg);
+      release_buffer(mode_arg);
       return;
     }
     if ((rnum = real_mobile(vnum)) < 0)
       send_to_char("No such mobile vnum.\r\n", ch);
     else
       olc_targ = (void *) &(mob_proto[rnum]);
+    release_buffer(arg);
     break;
   case OLC_OBJ:
+    arg = get_buffer(MAX_INPUT_LENGTH);
     argument = one_argument(argument, arg);
     if ((vnum = atoi(arg)) < 0) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "Invalid obj vnum '%s'\r\n", arg);
       send_to_char(buf, ch);
+      release_buffer(buf);
+      release_buffer(arg);
+      release_buffer(mode_arg);
       return;
     }
     if ((rnum = real_object(vnum)) < 0) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "No object with vnum %d.\r\n", vnum);
       send_to_char(buf, ch);
+      release_buffer(buf);
     } else
       olc_targ = (void *) &(obj_proto[rnum]);
+    release_buffer(arg);
     break;
   default:
     send_to_char("Usage: olc {.|set|show|obj|mob|room} [args]\r\n", ch);
+    release_buffer(mode_arg);
     return;
     break;
   }
 
+  release_buffer(mode_arg);
+
   if (olc_targ == NULL)
     return;
 
@@ -177,15 +209,18 @@ ACMD(do_olc)
 void olc_interpreter(void *targ, int mode, char *arg)
 {
   int error = 0, command;
-  char command_string[MAX_INPUT_LENGTH];
+  char *command_string = get_buffer(MAX_INPUT_LENGTH);
   struct char_data *olc_mob = NULL;
   struct room_data *olc_room = NULL;
   struct obj_data *olc_obj = NULL;
 
   half_chop(arg, command_string, arg);
   if ((command = search_block(command_string, olc_commands, FALSE)) < 0) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Invalid OLC command '%s'.\r\n", command_string);
     send_to_char(buf, olc_ch);
+    release_buffer(buf);
+    release_buffer(command_string);
     return;
   }
   switch (mode) {
@@ -201,7 +236,6 @@ void olc_interpreter(void *targ, int mod
   default:
     log("SYSERR: Invalid OLC mode passed to interp.");
     return;
-    break;
   }
 
 
@@ -267,6 +301,7 @@ void olc_interpreter(void *targ, int mod
     }
 
   }
+  release_buffer(command_string);
 }
 
 
@@ -280,6 +315,8 @@ int can_modify(struct char_data * ch, in
 /* generic fn for modifying a string */
 void olc_string(char **string, size_t maxlen, char *arg)
 {
+  char *buf = get_buffer(SMALL_BUFSIZE);
+
   skip_spaces(&arg);
 
   if (!*arg) {
@@ -301,6 +338,7 @@ void olc_string(char **string, size_t ma
       send_to_char(OK, olc_ch);
     }
   }
+  release_buffer(buf);
 }
 
 
@@ -308,7 +346,7 @@ void olc_string(char **string, size_t ma
 void olc_bitvector(int *bv, char **names, char *arg)
 {
   int newbv, flagnum, remove = 0;
-  char *this_name;
+  char *this_name, *buf2, *buf;
 
   skip_spaces(&arg);
 
@@ -322,6 +360,8 @@ void olc_bitvector(int *bv, char **names
   else
     newbv = 0;
 
+  buf2 = get_buffer(SMALL_BUFSIZE);
+  buf = get_buffer(MAX_INPUT_LENGTH);
   while (*arg) {
     arg = one_argument(arg, buf);	/* get next argument */
 
@@ -357,6 +397,8 @@ void olc_bitvector(int *bv, char **names
   sprintbit(newbv, names, buf);
   sprintf(buf2, "Flags now set to: %s\r\n", buf);
   send_to_char(buf2, olc_ch);
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 void olc_set_show(struct char_data * ch, int olc_mode, char *arg)
diff -uprN -x *.o ../stk/shop.c ./shop.c
--- ../stk/shop.c	Thu Jun 19 00:58:38 1997
+++ ./shop.c	Tue Aug 19 01:39:23 1997
@@ -51,7 +51,7 @@ int cmd_say, cmd_tell, cmd_emote, cmd_sl
 
 int is_ok_char(struct char_data * keeper, struct char_data * ch, int shop_nr)
 {
-  char buf[200];
+  char *buf;
 
   if (!(CAN_SEE(keeper, ch))) {
     do_say(keeper, MSG_NO_SEE_CHAR, cmd_say, 0);
@@ -63,8 +63,10 @@ int is_ok_char(struct char_data * keeper
   if ((IS_GOOD(ch) && NOTRADE_GOOD(shop_nr)) ||
       (IS_EVIL(ch) && NOTRADE_EVIL(shop_nr)) ||
       (IS_NEUTRAL(ch) && NOTRADE_NEUTRAL(shop_nr))) {
+    buf = get_buffer(200);
     sprintf(buf, "%s %s", GET_NAME(ch), MSG_NO_SELL_ALIGN);
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return (FALSE);
   }
   if (IS_NPC(ch))
@@ -74,8 +76,10 @@ int is_ok_char(struct char_data * keeper
       (IS_CLERIC(ch) && NOTRADE_CLERIC(shop_nr)) ||
       (IS_THIEF(ch) && NOTRADE_THIEF(shop_nr)) ||
       (IS_WARRIOR(ch) && NOTRADE_WARRIOR(shop_nr))) {
+    buf = get_buffer(200);
     sprintf(buf, "%s %s", GET_NAME(ch), MSG_NO_SELL_CLASS);
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return (FALSE);
   }
   return (TRUE);
@@ -84,7 +88,7 @@ int is_ok_char(struct char_data * keeper
 
 int is_open(struct char_data * keeper, int shop_nr, int msg)
 {
-  char buf[200];
+  char *buf = get_buffer(200);
 
   *buf = 0;
   if (SHOP_OPEN1(shop_nr) > time_info.hours)
@@ -95,10 +99,13 @@ int is_open(struct char_data * keeper, i
     else if (SHOP_CLOSE2(shop_nr) < time_info.hours)
       strcpy(buf, MSG_CLOSED_FOR_DAY);
 
-  if (!(*buf))
+  if (!(*buf)) {
+    release_buffer(buf);
     return (TRUE);
+  }
   if (msg)
     do_say(keeper, buf, cmd_tell, 0);
+  release_buffer(buf);
   return (FALSE);
 }
 
@@ -165,7 +172,7 @@ int find_oper_num(char token)
 int evaluate_expression(struct obj_data * obj, char *expr)
 {
   struct stack_data ops, vals;
-  char *ptr, *end, name[200];
+  char *ptr, *end, *name;
   int temp, index;
 
   if (!expr)
@@ -176,6 +183,7 @@ int evaluate_expression(struct obj_data 
 
   ops.len = vals.len = 0;
   ptr = expr;
+  name = get_buffer(200);
   while (*ptr) {
     if (isspace(*ptr))
       ptr++;
@@ -216,6 +224,7 @@ int evaluate_expression(struct obj_data 
     log("Extra operands left on shop keyword expression stack");
     return (FALSE);
   }
+  release_buffer(name);
   return (temp);
 }
 
@@ -278,6 +287,7 @@ int shop_producing(struct obj_data * ite
   for (counter = 0; SHOP_PRODUCT(shop_nr, counter) != NOTHING; counter++)
     if (same_obj(item, &obj_proto[SHOP_PRODUCT(shop_nr, counter)]))
       return (TRUE);
+
   return (FALSE);
 }
 
@@ -285,18 +295,20 @@ int shop_producing(struct obj_data * ite
 int transaction_amt(char *arg)
 {
   int num;
+  char *buf = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(arg, buf);
   if (*buf)
     if ((is_number(buf))) {
       num = atoi(buf);
       strcpy(arg, arg + strlen(buf) + 1);
+      release_buffer(buf);
       return (num);
     }
+  release_buffer(buf);
   return (1);
 }
 
-
 char *times_message(struct obj_data * obj, char *name, int num)
 {
   static char buf[256];
@@ -323,13 +335,16 @@ struct obj_data *get_slide_obj_vis(struc
 {
   struct obj_data *i, *last_match = 0;
   int j, number;
-  char tmpname[MAX_INPUT_LENGTH];
+  char *tmpname = get_buffer(MAX_INPUT_LENGTH);
   char *tmp;
 
   strcpy(tmpname, name);
   tmp = tmpname;
-  if (!(number = get_number(&tmp)))
+  if (!(number = get_number(&tmp))) {
+    release_buffer(tmpname);
     return (0);
+  }
+  release_buffer(tmpname);
 
   for (i = list, j = 1; i && (j <= number); i = i->next_content)
     if (isname(tmp, i->name))
@@ -368,7 +383,8 @@ struct obj_data *get_hash_obj_vis(struct
 struct obj_data *get_purchase_obj(struct char_data * ch, char *arg,
 		            struct char_data * keeper, int shop_nr, int msg)
 {
-  char buf[MAX_STRING_LENGTH], name[MAX_INPUT_LENGTH];
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*name = get_buffer(MAX_INPUT_LENGTH);
   struct obj_data *obj;
 
   one_argument(arg, name);
@@ -382,6 +398,8 @@ struct obj_data *get_purchase_obj(struct
 	sprintf(buf, shop_index[shop_nr].no_such_item1, GET_NAME(ch));
 	do_tell(keeper, buf, cmd_tell, 0);
       }
+      release_buffer(name);
+      release_buffer(buf);
       return (0);
     }
     if (GET_OBJ_COST(obj) <= 0) {
@@ -389,6 +407,9 @@ struct obj_data *get_purchase_obj(struct
       obj = 0;
     }
   } while (!obj);
+
+  release_buffer(name);
+  release_buffer(buf);
   return (obj);
 }
 
@@ -398,16 +419,21 @@ int buy_price(struct obj_data * obj, int
   return ((int) (GET_OBJ_COST(obj) * SHOP_BUYPROFIT(shop_nr)));
 }
 
-
+/*
+ * XXX: This relies on release_and_return;
+ */
 void shopping_buy(char *arg, struct char_data * ch,
 		       struct char_data * keeper, int shop_nr)
 {
-  char tempstr[200], buf[MAX_STRING_LENGTH];
+  char	*tempstr = get_buffer(200),
+	*buf = get_buffer(MAX_STRING_LENGTH);
   struct obj_data *obj, *last_obj = NULL;
   int goldamt = 0, buynum, bought = 0;
 
-  if (!(is_ok(keeper, ch, shop_nr)))
+  if (!(is_ok(keeper, ch, shop_nr))) {
+    release_my_buffers();
     return;
+  }
 
   if (SHOP_SORT(shop_nr) < IS_CARRYING_N(keeper))
     sort_keeper_objs(keeper, shop_nr);
@@ -416,15 +442,17 @@ void shopping_buy(char *arg, struct char
     sprintf(buf, "%s A negative amount?  Try selling me something.",
 	    GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
-    return;
+    release_and_return;
   }
   if (!(*arg) || !(buynum)) {
     sprintf(buf, "%s What do you want to buy??", GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
-    return;
+    release_and_return;
   }
-  if (!(obj = get_purchase_obj(ch, arg, keeper, shop_nr, TRUE)))
+  if (!(obj = get_purchase_obj(ch, arg, keeper, shop_nr, TRUE))) {
+    release_my_buffers();
     return;
+  }
 
   if ((buy_price(obj, shop_nr) > GET_GOLD(ch)) && !IS_GOD(ch)) {
     sprintf(buf, shop_index[shop_nr].missing_cash2, GET_NAME(ch));
@@ -433,25 +461,25 @@ void shopping_buy(char *arg, struct char
     switch (SHOP_BROKE_TEMPER(shop_nr)) {
     case 0:
       do_action(keeper, GET_NAME(ch), cmd_puke, 0);
-      return;
+      release_and_return;
     case 1:
       do_echo(keeper, "smokes on his joint.", cmd_emote, SCMD_EMOTE);
-      return;
+      release_and_return;
     default:
-      return;
+      release_and_return;
     }
   }
   if ((IS_CARRYING_N(ch) + 1 > CAN_CARRY_N(ch))) {
     sprintf(buf, "%s: You can't carry any more items.\n\r",
 	    fname(obj->name));
     send_to_char(buf, ch);
-    return;
+    release_and_return;
   }
   if ((IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj)) > CAN_CARRY_W(ch)) {
     sprintf(buf, "%s: You can't carry that much weight.\n\r",
 	    fname(obj->name));
     send_to_char(buf, ch);
-    return;
+    release_and_return;
   }
   while ((obj) && ((GET_GOLD(ch) >= buy_price(obj, shop_nr)) || IS_GOD(ch))
 	 && (IS_CARRYING_N(ch) < CAN_CARRY_N(ch)) && (bought < buynum)
@@ -507,26 +535,31 @@ void shopping_buy(char *arg, struct char
       SHOP_BANK(shop_nr) += (GET_GOLD(keeper) - MAX_OUTSIDE_BANK);
       GET_GOLD(keeper) = MAX_OUTSIDE_BANK;
     }
+  release_buffer(tempstr);
+  release_buffer(buf);
 }
 
 
 struct obj_data *get_selling_obj(struct char_data * ch, char *name,
 		            struct char_data * keeper, int shop_nr, int msg)
 {
-  char buf[MAX_STRING_LENGTH];
+  char *buf;
   struct obj_data *obj;
   int result;
 
   if (!(obj = get_obj_in_list_vis(ch, name, ch->carrying))) {
     if (msg) {
+      buf = get_buffer(MAX_STRING_LENGTH);
       sprintf(buf, shop_index[shop_nr].no_such_item2, GET_NAME(ch));
       do_tell(keeper, buf, cmd_tell, 0);
+      release_buffer(buf);
     }
     return (0);
   }
   if ((result = trade_with(obj, shop_nr)) == OBJECT_OK)
     return (obj);
 
+  buf = get_buffer(SMALL_BUFSIZE);
   switch (result) {
   case OBJECT_NOTOK:
     sprintf(buf, shop_index[shop_nr].do_not_buy, GET_NAME(ch));
@@ -543,6 +576,7 @@ struct obj_data *get_selling_obj(struct 
   }
   if (msg)
     do_tell(keeper, buf, cmd_tell, 0);
+  release_buffer(buf);
   return (0);
 }
 
@@ -620,7 +654,7 @@ void sort_keeper_objs(struct char_data *
 void shopping_sell(char *arg, struct char_data * ch,
 		        struct char_data * keeper, int shop_nr)
 {
-  char tempstr[200], buf[MAX_STRING_LENGTH], name[200];
+  char	*tempstr, *buf, *name;
   struct obj_data *obj, *tag = 0;
   int sellnum, sold = 0, goldamt = 0;
 
@@ -628,23 +662,32 @@ void shopping_sell(char *arg, struct cha
     return;
 
   if ((sellnum = transaction_amt(arg)) < 0) {
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "%s A negative amount?  Try buying something.",
 	    GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return;
   }
   if (!(*arg) || !(sellnum)) {
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "%s What do you want to sell??", GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return;
   }
+  name = get_buffer(MAX_INPUT_LENGTH);
   one_argument(arg, name);
-  if (!(obj = get_selling_obj(ch, name, keeper, shop_nr, TRUE)))
+  obj = get_selling_obj(ch, name, keeper, shop_nr, TRUE);
+  release_buffer(name);
+  if (!obj)
     return;
 
   if (GET_GOLD(keeper) + SHOP_BANK(shop_nr) < sell_price(ch, obj, shop_nr)) {
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, shop_index[shop_nr].missing_cash1, GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return;
   }
   while ((obj) && (GET_GOLD(keeper) + SHOP_BANK(shop_nr) >=
@@ -660,6 +703,7 @@ void shopping_sell(char *arg, struct cha
   }
 
   if (sold < sellnum) {
+    buf = get_buffer(SMALL_BUFSIZE);
     if (!obj)
       sprintf(buf, "%s You only have %d of those.", GET_NAME(ch), sold);
     else if (GET_GOLD(keeper) + SHOP_BANK(shop_nr) <
@@ -671,7 +715,12 @@ void shopping_sell(char *arg, struct cha
 	      GET_NAME(ch), sold);
 
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
   }
+
+  tempstr = get_buffer(200);
+  name = get_buffer(200);
+  buf = get_buffer(SMALL_BUFSIZE);
   GET_GOLD(ch) += goldamt;
   strcpy(tempstr, times_message(0, name, sold));
   sprintf(buf, "$n sells %s.", tempstr);
@@ -682,6 +731,10 @@ void shopping_sell(char *arg, struct cha
   sprintf(buf, "The shopkeeper now has %s.\n\r", tempstr);
   send_to_char(buf, ch);
 
+  release_buffer(buf);
+  release_buffer(tempstr);
+  release_buffer(name);
+
   if (GET_GOLD(keeper) < MIN_OUTSIDE_BANK) {
     goldamt = MIN(MAX_OUTSIDE_BANK - GET_GOLD(keeper), SHOP_BANK(shop_nr));
     SHOP_BANK(shop_nr) -= goldamt;
@@ -693,25 +746,34 @@ void shopping_sell(char *arg, struct cha
 void shopping_value(char *arg, struct char_data * ch,
 		         struct char_data * keeper, int shop_nr)
 {
-  char buf[MAX_STRING_LENGTH];
+  char *buf, *name;
   struct obj_data *obj;
-  char name[MAX_INPUT_LENGTH];
 
   if (!(is_ok(keeper, ch, shop_nr)))
     return;
 
   if (!(*arg)) {
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "%s What do you want me to valuate??", GET_NAME(ch));
     do_tell(keeper, buf, cmd_tell, 0);
+    release_buffer(buf);
     return;
   }
+  /*
+   * one_argument(arg, (name = get_buffer(MAX_INPUT_LENGTH))); ? --GG
+   */
+  name = get_buffer(MAX_INPUT_LENGTH);
   one_argument(arg, name);
-  if (!(obj = get_selling_obj(ch, name, keeper, shop_nr, TRUE)))
+  obj = get_selling_obj(ch, name, keeper, shop_nr, TRUE);
+  release_buffer(name);
+  if (!obj)
     return;
 
+  buf = get_buffer(SMALL_BUFSIZE);
   sprintf(buf, "%s I'll give you %d gold coins for that!", GET_NAME(ch),
 	  sell_price(ch, obj, shop_nr));
   do_tell(keeper, buf, cmd_tell, 0);
+  release_buffer(buf);
 
   return;
 }
@@ -720,7 +782,8 @@ void shopping_value(char *arg, struct ch
 char *list_object(struct obj_data * obj, int cnt, int index, int shop_nr)
 {
   static char buf[256];
-  char buf2[300], buf3[200];
+  char	*buf2 = get_buffer(300),
+	*buf3 = get_buffer(200);
   extern char *drinks[];
 
   if (shop_producing(obj, shop_nr))
@@ -743,6 +806,8 @@ char *list_object(struct obj_data * obj,
 
   sprintf(buf2, "%-48s %6d\n\r", buf3, buy_price(obj, shop_nr));
   strcat(buf, CAP(buf2));
+  release_buffer(buf2);
+  release_buffer(buf3);
   return (buf);
 }
 
@@ -750,13 +815,16 @@ char *list_object(struct obj_data * obj,
 void shopping_list(char *arg, struct char_data * ch,
 		        struct char_data * keeper, int shop_nr)
 {
-  char buf[MAX_STRING_LENGTH], name[200];
+  char *buf, *name;
   struct obj_data *obj, *last_obj = 0;
   int cnt = 0, index = 0;
 
   if (!(is_ok(keeper, ch, shop_nr)))
     return;
 
+  buf = get_buffer(MAX_STRING_LENGTH);
+  name = get_buffer(200);
+
   if (SHOP_SORT(shop_nr) < IS_CARRYING_N(keeper))
     sort_keeper_objs(keeper, shop_nr);
 
@@ -788,7 +856,9 @@ void shopping_list(char *arg, struct cha
   else if (!(*name) || isname(name, last_obj->name))
     strcat(buf, list_object(last_obj, cnt, index, shop_nr));
 
+  release_buffer(name);
   page_string(ch->desc, buf, 1);
+  release_buffer(buf);
 }
 
 
@@ -805,7 +875,6 @@ int ok_shop_room(int shop_nr, int room)
 
 SPECIAL(shop_keeper)
 {
-  char argm[MAX_INPUT_LENGTH];
   struct char_data *keeper = (struct char_data *) me;
   int shop_nr;
 
@@ -817,7 +886,7 @@ SPECIAL(shop_keeper)
     return (FALSE);
 
   if (SHOP_FUNC(shop_nr))	/* Check secondary function */
-    if ((SHOP_FUNC(shop_nr)) (ch, me, cmd, arg))
+    if ((SHOP_FUNC(shop_nr)) (ch, me, cmd, NULL))
       return (TRUE);
 
   if (keeper == ch) {
@@ -832,9 +901,11 @@ SPECIAL(shop_keeper)
     return (FALSE);
 
   if (CMD_IS("steal")) {
+    char *argm = get_buffer(MAX_INPUT_LENGTH);
     sprintf(argm, "$N shouts '%s'", MSG_NO_STEAL_HERE);
     do_action(keeper, GET_NAME(ch), cmd_slap, 0);
     act(argm, FALSE, ch, 0, keeper, TO_CHAR);
+    release_buffer(argm);
     return (TRUE);
   }
 
@@ -857,15 +928,16 @@ SPECIAL(shop_keeper)
 
 int ok_damage_shopkeeper(struct char_data * ch, struct char_data * victim)
 {
-  char buf[200];
   int index;
 
   if (IS_NPC(victim) && (mob_index[GET_MOB_RNUM(victim)].func == shop_keeper))
     for (index = 0; index < top_shop; index++)
       if ((GET_MOB_RNUM(victim) == SHOP_KEEPER(index)) && !SHOP_KILL_CHARS(index)) {
+	char *buf = get_buffer(200);
 	do_action(victim, GET_NAME(ch), cmd_slap, 0);
 	sprintf(buf, "%s %s", GET_NAME(ch), MSG_CANT_KILL_KEEPER);
 	do_tell(victim, buf, cmd_tell, 0);
+	release_buffer(buf);
 	return (FALSE);
       }
   return (TRUE);
@@ -893,8 +965,10 @@ int add_to_list(struct shop_buy_data * l
 int end_read_list(struct shop_buy_data * list, int len, int error)
 {
   if (error) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "Raise MAX_SHOP_OBJ constant in shop.h to %d", len + error);
     log(buf);
+    release_buffer(buf);
   }
   BUY_WORD(list[len]) = 0;
   BUY_TYPE(list[len++]) = NOTHING;
@@ -904,10 +978,13 @@ int end_read_list(struct shop_buy_data *
 
 void read_line(FILE * shop_f, char *string, void *data)
 {
+  char *buf = get_buffer(MAX_STRING_LENGTH);
+
   if (!get_line(shop_f, buf) || !sscanf(buf, string, data)) {
     fprintf(stderr, "Error in shop #%d\n", SHOP_NUM(top_shop));
     exit(1);
   }
+  release_buffer(buf);
 }
 
 
@@ -934,10 +1011,12 @@ int read_type_list(FILE * shop_f, struct
 		       int new_format, int max)
 {
   int index, num, len = 0, error = 0;
-  char *ptr;
+  char *ptr, *buf;
 
   if (!new_format)
     return (read_list(shop_f, list, 0, max, LIST_TRADE));
+
+  buf = get_buffer(MAX_STRING_LENGTH);
   do {
     fgets(buf, MAX_STRING_LENGTH - 1, shop_f);
     if ((ptr = strchr(buf, ';')) != NULL)
@@ -966,13 +1045,15 @@ int read_type_list(FILE * shop_f, struct
     if (*ptr)
       BUY_WORD(list[len - 1]) = str_dup(ptr);
   } while (num >= 0);
+
+  release_buffer(buf);
   return (end_read_list(list, len, error));
 }
 
 
 void boot_the_shops(FILE * shop_f, char *filename, int rec_count)
 {
-  char *buf, buf2[150];
+  char *buf, *buf2 = get_buffer(150);
   int temp, count, new_format = 0;
   struct shop_buy_data list[MAX_SHOP_OBJ + 1];
   int done = 0;
@@ -1040,6 +1121,7 @@ void boot_the_shops(FILE * shop_f, char 
       free(buf);		/* Plug memory leak! */
     }
   }
+  release_buffer(buf2);
 }
 
 
@@ -1063,9 +1145,16 @@ void assign_the_shopkeepers(void)
 char *customer_string(int shop_nr, int detailed)
 {
   int index, cnt = 1;
+  /*
+   * Technically the buffer _will_ live long enough to pass back to the
+   * function that called us.  However, it will result in ugly
+   * "so and so forgot to release buffer" messages.  A better solution
+   * would be for the code below us to assume that the memory passed to
+   * it was malloc'd and to free it, or in this case, release_buffer it.
+   */
   static char buf[256];
 
-  *buf = 0;
+  *buf = '\0';
   for (index = 0; *trade_letters[index] != '\n'; index++, cnt *= 2)
     if (!(SHOP_TRADE_WITH(shop_nr) & cnt))
       if (detailed) {
@@ -1084,6 +1173,9 @@ char *customer_string(int shop_nr, int d
 void list_all_shops(struct char_data * ch)
 {
   int shop_nr;
+  char	*buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH),
+	*buf2 = get_buffer(MAX_STRING_LENGTH);
 
   strcpy(buf, "\n\r");
   for (shop_nr = 0; shop_nr < top_shop; shop_nr++) {
@@ -1103,7 +1195,15 @@ void list_all_shops(struct char_data * c
     sprintf(END_OF(buf), "%s\n\r", buf2);
   }
 
+  /*
+   * There is a reason for putting these releases above the page_string.
+   * If page_string needs memory, we can use these instead of causing
+   * it to potentially have to create another buffer.
+   */
+  release_buffer(buf1);
+  release_buffer(buf2);
   page_string(ch->desc, buf, 1);
+  release_buffer(buf);
 }
 
 
@@ -1124,6 +1224,8 @@ void list_detailed_shop(struct char_data
   struct obj_data *obj;
   struct char_data *k;
   int index, temp;
+  char	*buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH);
 
   sprintf(buf, "Vnum:       [%5d], Rnum: [%5d]\n\r", SHOP_NUM(shop_nr),
 	  shop_nr + 1);
@@ -1208,6 +1310,8 @@ void list_detailed_shop(struct char_data
   sprintbit((long) SHOP_BITVECTOR(shop_nr), shop_bits, buf1);
   sprintf(buf, "Bits:       %s\n\r", buf1);
   send_to_char(buf, ch);
+  release_buffer(buf1);
+  release_buffer(buf);
 }
 
 
diff -uprN -x *.o ../stk/spec_assign.c ./spec_assign.c
--- ../stk/spec_assign.c	Thu Jun 19 00:58:38 1997
+++ ./spec_assign.c	Sat Aug 16 23:46:09 1997
@@ -29,9 +29,10 @@ void ASSIGNMOB(int mob, SPECIAL(fname))
   if (real_mobile(mob) >= 0)
     mob_index[real_mobile(mob)].func = fname;
   else if (!mini_mud) {
-    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant mob #%d",
-	    mob);
+    char *buf = get_buffer(SMALL_BUFSIZE);
+    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant mob #%d", mob);
     log(buf);
+    release_buffer(buf);
   }
 }
 
@@ -40,9 +41,10 @@ void ASSIGNOBJ(int obj, SPECIAL(fname))
   if (real_object(obj) >= 0)
     obj_index[real_object(obj)].func = fname;
   else if (!mini_mud) {
-    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant obj #%d",
-	    obj);
+    char *buf = get_buffer(SMALL_BUFSIZE);
+    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant obj #%d", obj);
     log(buf);
+    release_buffer(buf);
   }
 }
 
@@ -51,9 +53,11 @@ void ASSIGNROOM(int room, SPECIAL(fname)
   if (real_room(room) >= 0)
     world[real_room(room)].func = fname;
   else if (!mini_mud) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "SYSERR: Attempt to assign spec to non-existant rm. #%d",
 	    room);
     log(buf);
+    release_buffer(buf);
   }
 }
 
diff -uprN -x *.o ../stk/spec_procs.c ./spec_procs.c
--- ../stk/spec_procs.c	Thu Jun 19 00:58:38 1997
+++ ./spec_procs.c	Sat Aug 16 23:50:13 1997
@@ -69,26 +69,26 @@ void sort_spells(void)
 
 char *how_good(int percent)
 {
-  static char buf[256];
+  static char *buf;
 
   if (percent == 0)
-    strcpy(buf, " (not learned)");
+    buf = " (not learned)";
   else if (percent <= 10)
-    strcpy(buf, " (awful)");
+    buf = " (awful)";
   else if (percent <= 20)
-    strcpy(buf, " (bad)");
+    buf = " (bad)";
   else if (percent <= 40)
-    strcpy(buf, " (poor)");
+    buf = " (poor)";
   else if (percent <= 55)
-    strcpy(buf, " (average)");
+    buf = " (average)";
   else if (percent <= 70)
-    strcpy(buf, " (fair)");
+    buf = " (fair)";
   else if (percent <= 80)
-    strcpy(buf, " (good)");
+    buf = " (good)";
   else if (percent <= 85)
-    strcpy(buf, " (very good)");
+    buf = " (very good)";
   else
-    strcpy(buf, " (superb)");
+    buf = " (superb)";
 
   return (buf);
 }
@@ -116,6 +116,8 @@ void list_skills(struct char_data * ch)
   extern char *spells[];
   extern struct spell_info_type spell_info[];
   int i, sortpos;
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*buf2 = get_buffer(MAX_STRING_LENGTH);
 
   if (!GET_PRACTICES(ch))
     strcpy(buf, "You have no practice sessions remaining.\r\n");
@@ -139,7 +141,9 @@ void list_skills(struct char_data * ch)
     }
   }
 
+  release_buffer(buf);
   page_string(ch->desc, buf2, 1);
+  release_buffer(buf2);
 }
 
 
@@ -168,8 +172,10 @@ SPECIAL(guild)
 
   if (skill_num < 1 ||
       GET_LEVEL(ch) < spell_info[skill_num].min_level[(int) GET_CLASS(ch)]) {
+    char *buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "You do not know of that %s.\r\n", SPLSKL(ch));
     send_to_char(buf, ch);
+    release_buffer(buf);
     return 1;
   }
   if (GET_SKILL(ch, skill_num) >= LEARNED(ch)) {
@@ -614,7 +620,9 @@ SPECIAL(cityguard)
 
 SPECIAL(pet_shops)
 {
-  char buf[MAX_STRING_LENGTH], pet_name[256];
+#warning pet_shops and down: doesnt release_buffer()
+  char *buf = get_buffer(MAX_STRING_LENGTH),
+	*pet_name = get_buffer(256);
   int pet_room;
   struct char_data *pet;
 
@@ -682,14 +690,17 @@ SPECIAL(pet_shops)
 SPECIAL(bank)
 {
   int amount;
+  char *buf;
 
   if (CMD_IS("balance")) {
+    buf = get_buffer(SMALL_BUFSIZE);
     if (GET_BANK_GOLD(ch) > 0)
       sprintf(buf, "Your current balance is %d coins.\r\n",
 	      GET_BANK_GOLD(ch));
     else
       sprintf(buf, "You currently have no money deposited.\r\n");
     send_to_char(buf, ch);
+    release_buffer(buf);
     return 1;
   } else if (CMD_IS("deposit")) {
     if ((amount = atoi(argument)) <= 0) {
@@ -702,8 +713,10 @@ SPECIAL(bank)
     }
     GET_GOLD(ch) -= amount;
     GET_BANK_GOLD(ch) += amount;
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "You deposit %d coins.\r\n", amount);
     send_to_char(buf, ch);
+    release_buffer(buf);
     act("$n makes a bank transaction.", TRUE, ch, 0, FALSE, TO_ROOM);
     return 1;
   } else if (CMD_IS("withdraw")) {
@@ -717,8 +730,10 @@ SPECIAL(bank)
     }
     GET_GOLD(ch) += amount;
     GET_BANK_GOLD(ch) -= amount;
+    buf = get_buffer(SMALL_BUFSIZE);
     sprintf(buf, "You withdraw %d coins.\r\n", amount);
     send_to_char(buf, ch);
+    release_buffer(buf);
     act("$n makes a bank transaction.", TRUE, ch, 0, FALSE, TO_ROOM);
     return 1;
   } else
diff -uprN -x *.o ../stk/spell_parser.c ./spell_parser.c
--- ../stk/spell_parser.c	Thu Jun 19 00:58:38 1997
+++ ./spell_parser.c	Sat Aug 16 23:52:21 1997
@@ -211,7 +211,10 @@ int mag_manacost(struct char_data * ch, 
 void say_spell(struct char_data * ch, int spellnum, struct char_data * tch,
 	            struct obj_data * tobj)
 {
-  char lbuf[256];
+  char *lbuf = get_buffer(256),
+	*buf = get_buffer(MAX_STRING_LENGTH),
+	*buf1 = get_buffer(MAX_STRING_LENGTH),
+	*buf2 = get_buffer(MAX_STRING_LENGTH);
 
   struct char_data *i;
   int j, ofs = 0;
@@ -256,6 +259,10 @@ void say_spell(struct char_data * ch, in
 	    GET_CLASS(ch) == GET_CLASS(tch) ? spells[spellnum] : buf);
     act(buf1, FALSE, ch, NULL, tch, TO_VICT);
   }
+  release_buffer(buf2);
+  release_buffer(buf1);
+  release_buffer(buf);
+  release_buffer(lbuf);
 }
 
 
@@ -286,7 +293,7 @@ int find_skill_num(char *name)
 {
   int index = 0, ok;
   char *temp, *temp2;
-  char first[256], first2[256];
+  char *first = get_buffer(256), *first2 = get_buffer(256);
 
   while (*spells[++index] != '\n') {
     if (is_abbrev(name, spells[index]))
@@ -422,6 +429,7 @@ void mag_objectmagic(struct char_data * 
   int i, k;
   struct char_data *tch = NULL, *next_tch;
   struct obj_data *tobj = NULL;
+  char *arg = get_buffer(MAX_INPUT_LENGTH);
 
   one_argument(argument, arg);
 
@@ -475,13 +483,13 @@ void mag_objectmagic(struct char_data * 
 	act("$n points $p at $P.", TRUE, ch, obj, tobj, TO_ROOM);
     } else {
       act("At what should $p be pointed?", FALSE, ch, obj, NULL, TO_CHAR);
-      return;
+      break;
     }
 
     if (GET_OBJ_VAL(obj, 2) <= 0) {
       act("It seems powerless.", FALSE, ch, obj, 0, TO_CHAR);
       act("Nothing seems to happen.", FALSE, ch, obj, 0, TO_ROOM);
-      return;
+      break;
     }
     GET_OBJ_VAL(obj, 2)--;
     WAIT_STATE(ch, PULSE_VIOLENCE);
@@ -497,7 +505,7 @@ void mag_objectmagic(struct char_data * 
       if (!k) {
 	act("There is nothing to here to affect with $p.", FALSE,
 	    ch, obj, NULL, TO_CHAR);
-	return;
+	break;
       }
     } else
       tch = ch;
@@ -538,6 +546,7 @@ void mag_objectmagic(struct char_data * 
     log("SYSERR: Unknown object_type in mag_objectmagic");
     break;
   }
+  release_buffer(arg);
 }
 
 
@@ -553,7 +562,7 @@ void mag_objectmagic(struct char_data * 
 int cast_spell(struct char_data * ch, struct char_data * tch,
 	           struct obj_data * tobj, int spellnum)
 {
-  char buf[256];
+  char *buf = get_buffer(256);
 
   if (spellnum < 0 || spellnum > TOP_SPELL_DEFINE) {
     sprintf(buf, "SYSERR: cast_spell trying to call spellnum %d\n", spellnum);
@@ -611,27 +620,31 @@ int cast_spell(struct char_data * ch, st
  * passes control to cast_spell().
  */
 
+/*
+ * XXX: This uses release_and_return;
+ */
 ACMD(do_cast)
 {
   struct char_data *tch = NULL;
   struct obj_data *tobj = NULL;
-  char *s, *t;
+  char *s, *t, *arg = get_buffer(MAX_STRING_LENGTH);
   int mana, spellnum, i, target = 0;
 
-  if (IS_NPC(ch))
-    return;
+  if (IS_NPC(ch)) {
+    release_and_return;	/* This requires {}. */
+  }
 
   /* get: blank, spell name, target name */
   s = strtok(argument, "'");
 
   if (s == NULL) {
     send_to_char("Cast what where?\r\n", ch);
-    return;
+    release_and_return;
   }
   s = strtok(NULL, "'");
   if (s == NULL) {
     send_to_char("Spell names must be enclosed in the Holy Magic Symbols: '\r\n", ch);
-    return;
+    release_and_return;
   }
   t = strtok(NULL, "\0");
 
@@ -640,15 +653,13 @@ ACMD(do_cast)
 
   if ((spellnum < 1) || (spellnum > MAX_SPELLS)) {
     send_to_char("Cast what?!?\r\n", ch);
-    return;
-  }
-  if (GET_LEVEL(ch) < SINFO.min_level[(int) GET_CLASS(ch)]) {
+    release_and_return;
+  } else if (GET_LEVEL(ch) < SINFO.min_level[(int) GET_CLASS(ch)]) {
     send_to_char("You do not know that spell!\r\n", ch);
-    return;
-  }
-  if (GET_SKILL(ch, spellnum) == 0) {
+    release_and_return;
+  } else if (GET_SKILL(ch, spellnum) == 0) {
     send_to_char("You are unfamiliar with that spell.\r\n", ch);
-    return;
+    release_and_return;
   }
   /* Find the target */
   if (t != NULL) {
@@ -703,26 +714,27 @@ ACMD(do_cast)
       target = TRUE;
     }
     if (!target) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "Upon %s should the spell be cast?\r\n",
 	 IS_SET(SINFO.targets, TAR_OBJ_ROOM | TAR_OBJ_INV | TAR_OBJ_WORLD) ?
 	      "what" : "who");
       send_to_char(buf, ch);
-      return;
+      release_buffer(buf);
+      release_and_return;
     }
   }
 
   if (target && (tch == ch) && SINFO.violent) {
     send_to_char("You shouldn't cast that on yourself -- could be bad for your health!\r\n", ch);
-    return;
-  }
-  if (!target) {
+    release_and_return;
+  } else if (!target) {
     send_to_char("Cannot find the target of your spell!\r\n", ch);
-    return;
+    release_and_return;
   }
   mana = mag_manacost(ch, spellnum);
   if ((mana > 0) && (GET_MANA(ch) < mana) && (GET_LEVEL(ch) < LVL_IMMORT)) {
     send_to_char("You haven't the energy to cast that spell!\r\n", ch);
-    return;
+    release_and_return;
   }
 
   /* You throws the dice and you takes your chances.. 101% is total failure */
@@ -747,12 +759,13 @@ ACMD(do_cast)
 
 void spell_level(int spell, int class, int level)
 {
-  char buf[256];
+  char *buf = get_buffer(256);
   int bad = 0;
 
   if (spell < 0 || spell > TOP_SPELL_DEFINE) {
     sprintf(buf, "SYSERR: attempting assign to illegal spellnum %d", spell);
     log(buf);
+    release_buffer(buf);
     return;
   }
 
@@ -772,6 +785,8 @@ void spell_level(int spell, int class, i
 
   if (!bad)    
     spell_info[spell].min_level[class] = level;
+
+  release_buffer(buf);
 }
 
 
diff -uprN -x *.o ../stk/spells.c ./spells.c
--- ../stk/spells.c	Thu Jun 19 00:58:38 1997
+++ ./spells.c	Sat Aug  9 23:52:50 1997
@@ -142,6 +142,7 @@ ASPELL(spell_summon)
     }
     if (!IS_NPC(victim) && !PRF_FLAGGED(victim, PRF_SUMMONABLE) &&
 	!PLR_FLAGGED(victim, PLR_KILLER)) {
+      char *buf = get_buffer(SMALL_BUFSIZE);
       sprintf(buf, "%s just tried to summon you to: %s.\r\n"
 	      "%s failed because you have summon protection on.\r\n"
 	      "Type NOSUMMON to allow other players to summon you.\r\n",
@@ -156,6 +157,7 @@ ASPELL(spell_summon)
       sprintf(buf, "%s failed summoning %s to %s.",
 	      GET_NAME(ch), GET_NAME(victim), world[ch->in_room].name);
       mudlog(buf, BRF, LVL_IMMORT, TRUE);
+      release_buffer(buf);
       return;
     }
   }
@@ -181,7 +183,8 @@ ASPELL(spell_summon)
 ASPELL(spell_locate_object)
 {
   struct obj_data *i;
-  char name[MAX_INPUT_LENGTH];
+  char *name = get_buffer(MAX_INPUT_LENGTH);
+  char *buf = get_buffer(SMALL_BUFSIZE);
   int j;
 
   strcpy(name, fname(obj->name));
@@ -214,6 +217,7 @@ ASPELL(spell_locate_object)
 
   if (j == level >> 1)
     send_to_char("You sense nothing.\n\r", ch);
+  release_buffer(name);
 }
 
 
@@ -276,6 +280,7 @@ ASPELL(spell_identify)
 {
   int i;
   int found;
+  char *buf = get_buffer(MAX_STRING_LENGTH);
 
   struct time_info_data age(struct char_data * ch);
 
@@ -287,10 +292,12 @@ ASPELL(spell_identify)
   extern char *affected_bits[];
 
   if (obj) {
+    char *buf2 = get_buffer(SMALL_BUFSIZE);
     send_to_char("You feel informed:\r\n", ch);
     sprintf(buf, "Object '%s', Item type: ", obj->short_description);
     sprinttype(GET_OBJ_TYPE(obj), item_types, buf2);
     strcat(buf, buf2);
+    release_buffer(buf2);
     strcat(buf, "\r\n");
     send_to_char(buf, ch);
 
@@ -378,6 +385,7 @@ ASPELL(spell_identify)
     send_to_char(buf, ch);
 
   }
+  release_buffer(buf);
 }
 
 
diff -uprN -x *.o ../stk/structs.h ./structs.h
--- ../stk/structs.h	Thu Jun 19 00:58:38 1997
+++ ./structs.h	Tue Aug 19 00:53:50 1997
@@ -423,6 +423,7 @@
 #define PULSE_ZONE      (10 RL_SEC)
 #define PULSE_MOBILE    (10 RL_SEC)
 #define PULSE_VIOLENCE  (2 RL_SEC)
+#define PULSE_BUFFER	(5 RL_SEC)
 
 #define SMALL_BUFSIZE		1024
 #define LARGE_BUFSIZE		(12 * 1024)
diff -uprN -x *.o ../stk/utils.c ./utils.c
--- ../stk/utils.c	Thu Jun 19 00:58:39 1997
+++ ./utils.c	Mon Aug 11 11:23:24 1997
@@ -114,12 +114,14 @@ int strn_cmp(char *arg1, char *arg2, int
 /* log a death trap hit */
 void log_death_trap(struct char_data * ch)
 {
-  char buf[150];
+  char *buf = get_buffer(150);
   extern struct room_data *world;
 
   sprintf(buf, "%s hit death trap #%d (%s)", GET_NAME(ch),
 	  world[ch->in_room].number, world[ch->in_room].name);
   mudlog(buf, BRF, LVL_IMMORT, TRUE);
+
+  release_buffer(buf);
 }
 
 
@@ -157,7 +159,7 @@ int touch(char *path)
  */
 void mudlog(char *str, char type, int level, byte file)
 {
-  char buf[MAX_STRING_LENGTH];
+  char *buf;
   extern struct descriptor_data *descriptor_list;
   struct descriptor_data *i;
   char *tmp, tp;
@@ -171,6 +173,7 @@ void mudlog(char *str, char type, int le
   if (level < 0)
     return;
 
+  buf = get_buffer(MAX_STRING_LENGTH);
   sprintf(buf, "[ %s ]\r\n", str);
 
   for (i = descriptor_list; i; i = i->next)
@@ -184,6 +187,7 @@ void mudlog(char *str, char type, int le
 	send_to_char(CCNRM(i->character, C_NRM), i->character);
       }
     }
+  release_buffer(buf);
 }
 
 
@@ -391,7 +395,7 @@ void add_follower(struct char_data * ch,
  */
 int get_line(FILE * fl, char *buf)
 {
-  char temp[256];
+  char *temp = get_buffer(256);
   int lines = 0;
 
   do {
@@ -401,10 +405,12 @@ int get_line(FILE * fl, char *buf)
       temp[strlen(temp) - 1] = '\0';
   } while (!feof(fl) && (*temp == '*' || !*temp));
 
-  if (feof(fl))
+  if (feof(fl)) {
+    release_buffer(temp);
     return 0;
-  else {
+  } else {
     strcpy(buf, temp);
+    release_buffer(temp);
     return lines;
   }
 }
@@ -412,7 +418,7 @@ int get_line(FILE * fl, char *buf)
 
 int get_filename(char *orig_name, char *filename, int mode)
 {
-  char *prefix, *middle, *suffix, *ptr, name[64];
+  char *prefix, *middle, *suffix, *ptr, *name;
 
   switch (mode) {
   case CRASH_FILE:
@@ -431,6 +437,7 @@ int get_filename(char *orig_name, char *
   if (!*orig_name)
     return 0;
 
+  name = get_buffer(64);
   strcpy(name, orig_name);
   for (ptr = name; *ptr; ptr++)
     *ptr = LOWER(*ptr);
@@ -457,6 +464,7 @@ int get_filename(char *orig_name, char *
   }
 
   sprintf(filename, "%s/%s/%s.%s", prefix, middle, name, suffix);
+  release_buffer(name);
   return 1;
 }
 
diff -uprN -x *.o ../stk/utils.h ./utils.h
--- ../stk/utils.h	Thu Jun 19 00:58:39 1997
+++ ./utils.h	Tue Jul 22 20:02:34 1997
@@ -449,3 +449,4 @@ void	update_pos(struct char_data *victim
 #define CRYPT(a,b) ((char *) crypt((a),(b)))
 #endif
 
+#include "buffer.h"
