diff -uprN ../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 ../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 ../stk/act.comm.c ./act.comm.c
--- ../stk/act.comm.c	Thu Jun 19 00:58:35 1997
+++ ./act.comm.c	Sun Aug  3 17:35:35 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,6 +213,8 @@ ACMD(do_spec_comm)
     }
     act(action_others, FALSE, ch, 0, vict, TO_NOTVICT);
   }
+  release_buffer(buf);
+  release_buffer(buf2);
 }
 
 
@@ -204,6 +223,12 @@ ACMD(do_spec_comm)
 
 ACMD(do_write)
 {
+  /* Argh! I hate functions with a lot of returns! */
+#warning BUFFER: do_write doesnt release_buffer()
+  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;
 
@@ -281,6 +306,8 @@ ACMD(do_write)
 
 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 +318,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 +328,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 +339,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 +361,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 +420,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 +437,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 +452,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 +491,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 +534,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 ../stk/act.informative.c ./act.informative.c
--- ../stk/act.informative.c	Thu Jun 19 00:58:35 1997
+++ ./act.informative.c	Sun Aug  3 18:49:39 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';
 
@@ -1194,6 +1266,7 @@ ACMD(do_users)
 ACMD(do_gen_ps)
 {
   extern char circlemud_version[];
+  char *buf;
 
   switch (subcmd) {
   case SCMD_CREDITS:
@@ -1230,7 +1303,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 +1318,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 +1337,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 +1378,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 +1389,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 +1423,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 +1446,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 +1473,7 @@ ACMD(do_levels)
     strcat(buf, "\r\n");
   }
   send_to_char(buf, ch);
+  release_buffer(buf);
 }
 
 
@@ -1393,13 +1482,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 +1532,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 +1549,7 @@ ACMD(do_diagnose)
     else
       send_to_char("Diagnose who?\r\n", ch);
   }
+  release_buffer(buf);
 }
 
 
@@ -1464,34 +1559,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 +1649,8 @@ ACMD(do_toggle)
 	  ctypes[COLOR_LEV(ch)]);
 
   send_to_char(buf, ch);
+  release_buffer(buf2);
+  release_buffer(buf);
 }
 
 
@@ -1599,16 +1707,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 +1730,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 +1752,6 @@ ACMD(do_commands)
 
   strcat(buf, "\r\n");
   send_to_char(buf, ch);
+  release_buffer(arg);
+  release_buffer(buf);
 }
diff -uprN ../stk/act.item.c ./act.item.c
--- ../stk/act.item.c	Thu Jun 19 00:58:35 1997
+++ ./act.item.c	Mon Jul 28 17:33:32 1997
@@ -53,8 +53,8 @@ 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);
+  char *arg2 = get_buffer(MAX_INPUT_LENGTH);
   struct obj_data *obj, *next_obj, *cont;
   struct char_data *tmp_char;
   int obj_dotmode, cont_dotmode, found = 0;
@@ -109,6 +109,8 @@ ACMD(do_put)
       }
     }
   }
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
@@ -256,8 +258,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;
@@ -282,11 +284,9 @@ ACMD(do_get)
 	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)))
@@ -317,6 +317,8 @@ ACMD(do_get)
       }
     }
   }
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
@@ -865,8 +867,9 @@ ACMD(do_eat)
 
 ACMD(do_pour)
 {
-  char arg1[MAX_INPUT_LENGTH];
-  char arg2[MAX_INPUT_LENGTH];
+#warning do_pour: does not free buffers
+  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;
 
@@ -1175,8 +1178,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 +1187,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,6 +1212,8 @@ 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))) {
@@ -1230,6 +1239,8 @@ ACMD(do_wear)
 	act("You can't wear $p.", FALSE, ch, obj, 0, TO_CHAR);
     }
   }
+  release_buffer(arg1);
+  release_buffer(arg2);
 }
 
 
diff -uprN ../stk/act.movement.c ./act.movement.c
--- ../stk/act.movement.c	Thu Jun 19 00:58:35 1997
+++ ./act.movement.c	Mon Jul 28 13:36:16 1997
@@ -389,7 +389,7 @@ 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;
 
@@ -399,6 +399,8 @@ ACMD(do_gen_door)
     send_to_char(CAP(buf), ch);
     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 +427,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;
 }
 
diff -uprN ../stk/act.offensive.c ./act.offensive.c
--- ../stk/act.offensive.c	Thu Jun 19 00:58:36 1997
+++ ./act.offensive.c	Mon Jul 28 17:34:59 1997
@@ -181,8 +181,8 @@ ACMD(do_backstab)
 
 ACMD(do_order)
 {
-  char name[100], message[256];
-  char buf[256];
+  char *name = get_buffer(100), *message = get_buffer(256);
+  char *buf = get_buffer(256);
   bool found = FALSE;
   int org_room;
   struct char_data *vict;
@@ -196,13 +196,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 +229,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);
 }
 
 
diff -uprN ../stk/act.other.c ./act.other.c
--- ../stk/act.other.c	Thu Jun 19 00:58:36 1997
+++ ./act.other.c	Mon Jul 28 17:38:58 1997
@@ -160,21 +160,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 +213,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);
@@ -261,6 +264,9 @@ ACMD(do_steal)
     }
   }
 
+  release_buffer(vict_name);
+  release_buffer(obj_name);
+
   if (ohoh && IS_NPC(vict) && AWAKE(vict))
     hit(vict, ch, TYPE_UNDEFINED);
 }
@@ -718,7 +724,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 +758,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 ../stk/act.social.c ./act.social.c
--- ../stk/act.social.c	Thu Jun 19 00:58:36 1997
+++ ./act.social.c	Mon Jul 28 17:39:59 1997
@@ -176,19 +176,22 @@ ACMD(do_insult)
 
 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,7 +201,7 @@ 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[];
 
@@ -251,6 +254,7 @@ void boot_social_messages(void)
   }
 
   /* close file & set top */
+  release_buffer(next_soc);
   fclose(fl);
   list_top = curr_soc;
 
diff -uprN ../stk/act.wizard.c ./act.wizard.c
--- ../stk/act.wizard.c	Thu Jun 19 00:58:36 1997
+++ ./act.wizard.c	Sun Aug  3 19:32:01 1997
@@ -122,18 +122,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 +145,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 +158,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,22 +182,24 @@ sh_int find_target_room(struct char_data
 
 ACMD(do_at)
 {
-  char command[MAX_INPUT_LENGTH];
+  char *command = 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);
     return;
-  }
-
-  if (!*command) {
+  } else if (!*command) {
     send_to_char("What do you want to do there?\r\n", ch);
+    release_buffer(command);
     return;
   }
 
-  if ((location = find_target_room(ch, buf)) < 0)
+  if ((location = find_target_room(ch, buf)) < 0) {
+    release_buffer(command);
     return;
+  }
 
   /* a location has been found. */
   original_loc = ch->in_room;
@@ -202,6 +212,7 @@ ACMD(do_at)
     char_from_room(ch);
     char_to_room(ch, original_loc);
   }
+  release_buffer(command);
 }
 
 
@@ -1505,7 +1516,7 @@ 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);
 
   half_chop(argument, arg, to_force);
 
@@ -1551,6 +1562,7 @@ ACMD(do_force)
       command_interpreter(vict, to_force);
     }
   }
+  release_buffer(to_force);
 }
 
 
@@ -1838,7 +1850,7 @@ 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];
+  char *field, *value, *birth;
   extern char *class_abbrevs[];
   extern char *genders[];
   extern int buf_switches, buf_largecount, buf_overflows;
@@ -1859,6 +1871,7 @@ ACMD(do_show)
     { "godrooms",	LVL_GOD },
     { "shops",		LVL_IMMORT },
     { "houses",		LVL_GOD },
+    { "buffers",	LVL_GOD },
     { "\n", 0 }
   };
 
@@ -1874,6 +1887,8 @@ ACMD(do_show)
     return;
   }
 
+  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,6 +1897,8 @@ 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);
     return;
   }
   if (!strcmp(value, "."))
@@ -1898,7 +1915,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 +1925,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 +1939,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 +2013,15 @@ 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);
 }
 
 
@@ -2020,7 +2044,10 @@ 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];
+#warning do_set: does not release_buffer()
+  char *field = get_buffer(MAX_INPUT_LENGTH),
+	*name = 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;
@@ -2264,7 +2291,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 +2318,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 +2354,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 +2366,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 +2374,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 +2391,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 +2423,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';
diff -uprN ../stk/ban.c ./ban.c
--- ../stk/ban.c	Thu Jun 19 00:58:36 1997
+++ ./ban.c	Mon Jul 28 13:11:40 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,8 +120,9 @@ 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), *nextchar, *timestr;
   int i;
   struct ban_list_element *ban_node;
 
@@ -194,7 +202,7 @@ ACMD(do_ban)
 
 ACMD(do_unban)
 {
-  char site[80];
+  char *site = get_buffer(80);
   struct ban_list_element *ban_node, *temp;
   int found = 0;
 
@@ -240,7 +248,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 +272,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 ../stk/boards.c ./boards.c
--- ../stk/boards.c	Thu Jun 19 00:58:36 1997
+++ ./boards.c	Sun Aug  3 18:59:59 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,71 +290,71 @@ 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;
 }
 
 
 int Board_remove_msg(int board_type, struct char_data * ch, char *arg)
 {
+#warning Board_remove_msg: doesnt release_buffer()
   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);
diff -uprN ../stk/buffer.c ./buffer.c
--- ../stk/buffer.c	Wed Dec 31 19:00:00 1969
+++ ./buffer.c	Sun Aug  3 17:57:39 1997
@@ -0,0 +1,223 @@
+#include "conf.h"
+#include "sysdep.h"
+#include "structs.h"
+#include "utils.h"
+
+/* #include "buffer.h" - already done from structs.h */
+
+struct buf_data *buffers;
+
+#if 0
+#define PARANOID_BUFFER	1	/* memset vs '\0' */
+#endif
+#define MAX_BUFFERS	10	/* Not used */
+#define BUFFER_LIFE	(5*SECS_PER_REAL_MIN*PASSES_PER_SEC) /* 5 mins */
+#if 1
+#define QUIET	1	/* Non-verbose logging, only expired/forgot */
+#endif
+
+void send_to_char(char *, struct char_data *);
+
+void init_buffers(void)
+{
+  buffers = NULL;
+  new_buffer(8192, TRUE);
+  new_buffer(1024, TRUE);
+  new_buffer(16384, FALSE);
+  new_buffer(512, TRUE);
+  new_buffer(128, TRUE);
+  new_buffer(256, TRUE);
+}
+
+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;
+    }
+  }
+}
+
+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
+#if !defined(QUIET)
+  if ((*clearme->who != 'f' && *(clearme->who + 1) != 'r') && /* fread_string */
+      (*clearme->who != 'g' && *(clearme->who + 1) != 'e')) {
+    char buf[128];
+    sprintf(buf, "BUFFER: %s:%d released %d bytes.",
+		clearme->who, clearme->line, clearme->size);
+    log(buf);
+  }
+#endif
+  if (clearme->life == -1) {
+    char buf[128];
+    sprintf(buf, "BUFFER: Freeing %d byte persistant buffer, %s:%d!",
+		clearme->size, clearme->who, clearme->line);
+    log(buf);
+  }
+  clearme->who = NULL;
+  clearme->line = 0;
+  clearme->life = BUFFER_LIFE;
+  clearme->used = FALSE;
+}
+
+void release_buffer(char *data)
+{
+  struct buf_data *clear;
+
+  for (clear = get_buffer_head(); clear; clear = clear->next)
+    if (clear->data == data)
+      break;
+
+  if (clear)
+    clear_buffer(clear);
+  else
+    log("BUFFER: release_buffer: no such buffer found.");
+}
+  
+void free_buffer(struct buf_data *f)
+{
+  char buf[128];
+
+  sprintf(buf, "BUFFER: Freeing %d bytes in expired buffer.", f->size);
+  log(buf);
+
+  if (f->data)
+    free(f->data);
+  free(f);
+}
+
+struct buf_data *get_buffer_head()
+{
+  return buffers;
+}
+
+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;
+}
+
+struct buf_data *malloc_buffer(ush_int size, bool persistant)
+{
+#if !defined(QUIET)
+  static char buf[128];
+#endif
+
+  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 !defined(QUIET)
+  sprintf(buf, "BUFFER: Allocated %d byte buffer, %d bytes overhead.",
+		new_buf->size, sizeof(struct buf_data));
+  log(buf);
+#endif
+  return new_buf;
+}
+
+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 !defined(QUIET)
+  if ((*give->who != 'f' && *(give->who + 1) != 'r') && /* fread_string */
+      (*give->who != 'g' && *(give->who + 1) != 'e')) {
+    char buf[128];
+    sprintf(buf, "BUFFER: %s:%d requested %d bytes, received %d.",
+		who, line, size, give->size);
+    log(buf);
+  }
+#endif
+  return give->data;
+}
+
+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 ../stk/buffer.h ./buffer.h
--- ../stk/buffer.h	Wed Dec 31 19:00:00 1969
+++ ./buffer.h	Sun Aug  3 19:35:02 1997
@@ -0,0 +1,31 @@
+#if !defined(_BUFFER_H_)
+#define _BUFFER_H_
+
+struct buf_data {
+  bool used;
+  ush_int size;
+  ush_int line;
+  sh_int life;
+  char *data;
+  const char *who;
+  struct buf_data *next;
+};
+
+#define get_buffer(a)	acquire_buffer((a), __FUNCTION__, __LINE__)
+
+void init_buffers(void);
+void release_all_buffers();
+void clear_buffer(struct buf_data *clearme);
+void release_buffer(char *data);
+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);
+
+#if 1
+#define USE_CIRCLE_BUFFERS 1
+#endif
+
+#endif
diff -uprN ../stk/class.c ./class.c
--- ../stk/class.c	Thu Jun 19 00:58:36 1997
+++ ./class.c	Sun Aug  3 19:32:49 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"
 
diff -uprN ../stk/comm.c ./comm.c
--- ../stk/comm.c	Thu Jun 19 00:58:36 1997
+++ ./comm.c	Sun Aug  3 17:18:17 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) {
@@ -630,6 +640,9 @@ void game_loop(int mother_desc)
       }
     }
 
+    /* Clear out all the global buffers now in case someone forgot. */
+    release_all_buffers();
+
     /*
      * Now, we execute as many pulses as necessary--just one if we haven't
      * missed any pulses, or make up for lost time if we missed a few
@@ -756,7 +769,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 +791,7 @@ void record_usage(void)
     log(buf);
   }
 #endif
-
+  release_buffer(buf);
 }
 
 
@@ -821,7 +834,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 +844,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 +861,7 @@ void make_prompt(struct descriptor_data 
     strcat(prompt, "> ");
     write_to_descriptor(d->descriptor, prompt);
   }
+  release_buffer(prompt);
 }
 
 
@@ -900,12 +912,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 +1034,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 +1074,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 +1121,7 @@ int process_output(struct descriptor_dat
   t->bufptr = 0;
   *(t->output) = '\0';
 
+  release_buffer(i);
   return result;
 }
 
@@ -1150,7 +1167,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 +1238,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 +1264,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 +1309,7 @@ int process_input(struct descriptor_data
     *(write_point++) = *(read_point++);
   *write_point = '\0';
 
+  release_buffer(tmp);
   return 1;
 }
 
@@ -1299,7 +1322,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 +1335,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 +1345,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 +1366,7 @@ int perform_subst(struct descriptor_data
   new[MAX_INPUT_LENGTH - 1] = '\0';
   strcpy(subst, new);
 
+  release_buffer(new);
   return 0;
 }
 
@@ -1348,7 +1374,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 +1418,7 @@ void close_socket(struct descriptor_data
     free(d->showstr_vector);
 
   free(d);
+  release_buffer(buf);
 }
 
 
@@ -1652,7 +1679,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 +1757,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 ../stk/db.c ./db.c
--- ../stk/db.c	Thu Jun 19 00:58:37 1997
+++ ./db.c	Mon Jul 28 18:21:16 1997
@@ -425,13 +425,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;
 }
 
@@ -443,6 +444,8 @@ void index_boot(int mode)
   FILE *index, *db_file;
   int rec_count = 0;
 
+  release_all_buffers();
+
   switch (mode) {
   case DB_BOOT_WLD:
     prefix = WLD_PREFIX;
@@ -571,7 +574,7 @@ void index_boot(int mode)
 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 +588,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 +599,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,7 +652,7 @@ void parse_room(FILE * fl, int virtual_n
 {
   static int room_nr = 0, zone = 0;
   int t[10], i;
-  char line[256], flags[128];
+  char *line = get_buffer(256), *flags = get_buffer(128);
   struct extra_descr_data *new_descr;
 
   sprintf(buf2, "room #%d", virtual_nr);
@@ -703,6 +709,8 @@ 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);
       return;
       break;
     default:
@@ -715,11 +723,12 @@ 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);
 
   sprintf(buf2, "room #%d, direction D%d", world[room].number, dir);
 
@@ -744,6 +753,7 @@ 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);
 }
 
 
@@ -836,7 +846,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 +907,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 +994,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 +1018,8 @@ 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), *tmpptr, letter;
+  char *f1 = get_buffer(128), *f2 = get_buffer(128);
 
   mob_index[i].virtual = nr;
   mob_index[i].number = 0;
@@ -1059,6 +1072,10 @@ 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);
 }
 
 
@@ -1071,7 +1088,7 @@ char *parse_object(FILE * obj_f, int nr)
   static char line[256];
   int t[10], j;
   char *tmpptr;
-  char f1[256], f2[256];
+  char *f1 = get_buffer(256), *f2 = get_buffer(256);
   struct extra_descr_data *new_descr;
 
   obj_index[i].virtual = nr;
@@ -1173,6 +1190,8 @@ char *parse_object(FILE * obj_f, int nr)
     case '$':
     case '#':
       top_of_objt = i++;
+      release_buffer(f1);
+      release_buffer(f2);
       return line;
       break;
     default:
@@ -1191,7 +1210,7 @@ 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);
 
   strcpy(zname, zonename);
 
@@ -1264,6 +1283,8 @@ void load_zones(FILE * fl, char *zonenam
   }
 
   top_of_zone_table = zone++;
+  release_buffer(buf);
+  release_buffer(zname);
 }
 
 #undef Z
@@ -1282,8 +1303,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 +1334,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);
 }
 
 
@@ -1472,7 +1499,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 +1564,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 +1577,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) \
@@ -1989,7 +2019,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 +2061,8 @@ char *fread_string(FILE * fl, char *erro
   } else
     rslt = NULL;
 
+  release_buffer(tmp);
+  release_buffer(buf);
   return rslt;
 }
 
@@ -2141,16 +2173,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 +2193,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 +2214,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 +2223,7 @@ int file_to_string(char *name, char *buf
 
   fclose(fl);
 
+  release_buffer(tmp);
   return (0);
 }
 
diff -uprN ../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 ../stk/dependd ./dependd
--- ../stk/dependd	Wed Dec 31 19:00:00 1969
+++ ./dependd	Sun Aug  3 19:01:52 1997
@@ -0,0 +1,71 @@
+act.comm.o: act.comm.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h screen.h
+act.informative.o: act.informative.c conf.h sysdep.h structs.h utils.h \
+ buffer.h comm.h interpreter.h handler.h db.h spells.h screen.h
+act.item.o: act.item.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h spells.h
+act.movement.o: act.movement.c conf.h sysdep.h structs.h utils.h \
+ buffer.h comm.h interpreter.h handler.h db.h spells.h house.h
+act.offensive.o: act.offensive.c conf.h sysdep.h structs.h utils.h \
+ buffer.h comm.h interpreter.h handler.h db.h spells.h
+act.other.o: act.other.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h spells.h screen.h house.h
+act.social.o: act.social.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h spells.h
+act.wizard.o: act.wizard.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h spells.h house.h screen.h
+ban.o: ban.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ interpreter.h handler.h db.h
+boards.o: boards.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ db.h boards.h interpreter.h handler.h
+buffer.o: buffer.c conf.h sysdep.h structs.h utils.h buffer.h
+castle.o: castle.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ interpreter.h handler.h db.h spells.h
+class.o: class.c conf.h sysdep.h structs.h db.h utils.h buffer.h \
+ spells.h interpreter.h
+comm.o: comm.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ interpreter.h handler.h db.h house.h
+config.o: config.c conf.h sysdep.h structs.h
+constants.o: constants.c conf.h sysdep.h structs.h
+db.o: db.c conf.h sysdep.h structs.h utils.h buffer.h db.h comm.h \
+ handler.h spells.h mail.h interpreter.h house.h
+fight.o: fight.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ handler.h interpreter.h db.h spells.h screen.h
+graph.o: graph.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ interpreter.h handler.h db.h spells.h
+handler.o: handler.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ db.h handler.h interpreter.h spells.h
+house.o: house.c conf.h sysdep.h structs.h comm.h handler.h db.h \
+ interpreter.h utils.h buffer.h house.h
+interpreter.o: interpreter.c conf.h sysdep.h structs.h comm.h \
+ interpreter.h db.h utils.h buffer.h spells.h handler.h mail.h \
+ screen.h
+limits.o: limits.c conf.h sysdep.h structs.h utils.h buffer.h spells.h \
+ comm.h db.h handler.h
+magic.o: magic.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ spells.h handler.h db.h
+mail.o: mail.c conf.h sysdep.h structs.h utils.h buffer.h comm.h db.h \
+ interpreter.h handler.h mail.h
+mobact.o: mobact.c conf.h sysdep.h structs.h utils.h buffer.h db.h \
+ comm.h interpreter.h handler.h spells.h
+modify.o: modify.c conf.h sysdep.h structs.h utils.h buffer.h \
+ interpreter.h handler.h db.h comm.h spells.h mail.h boards.h
+objsave.o: objsave.c conf.h sysdep.h structs.h comm.h handler.h db.h \
+ interpreter.h utils.h buffer.h spells.h
+olc.o: olc.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ interpreter.h handler.h db.h olc.h
+random.o: random.c
+shop.o: shop.c conf.h sysdep.h structs.h comm.h handler.h db.h \
+ interpreter.h utils.h buffer.h shop.h
+spec_assign.o: spec_assign.c conf.h sysdep.h structs.h db.h \
+ interpreter.h utils.h buffer.h
+spec_procs.o: spec_procs.c conf.h sysdep.h structs.h utils.h buffer.h \
+ comm.h interpreter.h handler.h db.h spells.h
+spell_parser.o: spell_parser.c conf.h sysdep.h structs.h utils.h \
+ buffer.h interpreter.h spells.h handler.h comm.h db.h
+spells.o: spells.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ spells.h handler.h db.h
+utils.o: utils.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ screen.h spells.h handler.h
+weather.o: weather.c conf.h sysdep.h structs.h utils.h buffer.h comm.h \
+ handler.h interpreter.h db.h
diff -uprN ../stk/fight.c ./fight.c
--- ../stk/fight.c	Thu Jun 19 00:58:37 1997
+++ ./fight.c	Mon Jul 28 18:23:45 1997
@@ -88,7 +88,7 @@ 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"))) {
     sprintf(buf2, "Error reading combat message file %s", MESS_FILE);
@@ -137,7 +137,7 @@ void load_messages(void)
     while (!feof(fl) && (*chk == '\n' || *chk == '*'))
       fgets(chk, 128, fl);
   }
-
+  release_buffer(chk);
   fclose(fl);
 }
 
@@ -165,13 +165,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);
   }
 }
 
diff -uprN ../stk/handler.c ./handler.c
--- ../stk/handler.c	Thu Jun 19 00:58:37 1997
+++ ./handler.c	Sun Aug  3 19:37:06 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;
@@ -559,7 +559,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 +572,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 +615,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 +623,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 +924,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 +956,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 +988,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 +1016,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 +1026,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 +1063,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 +1108,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 +1126,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 +1146,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 +1181,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 +1212,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 ../stk/house.c ./house.c
--- ../stk/house.c	Thu Jun 19 00:58:37 1997
+++ ./house.c	Sun Aug  3 19:33:47 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,11 @@ 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 *built_on = get_buffer(128), *last_pay = get_buffer(128),
+	*own_name = get_buffer(128);
 
   if (!num_of_houses) {
     send_to_char("No houses have been defined.\r\n", ch);
@@ -345,7 +357,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;
@@ -497,7 +510,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);
 
diff -uprN ../stk/interpreter.c ./interpreter.c
--- ../stk/interpreter.c	Thu Jun 19 00:58:37 1997
+++ ./interpreter.c	Sun Aug  3 19:34:14 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"
@@ -783,7 +783,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 +791,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);
@@ -1238,9 +1244,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 +1270,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 +1313,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 +1329,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 +1381,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 +1393,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 +1403,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 +1533,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 +1674,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 ../stk/limits.c ./limits.c
--- ../stk/limits.c	Thu Jun 19 00:58:37 1997
+++ ./limits.c	Mon Jul 28 18:46:30 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);
diff -uprN ../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 ../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 ../stk/objsave.c ./objsave.c
--- ../stk/objsave.c	Thu Jun 19 00:58:38 1997
+++ ./objsave.c	Sun Aug  3 19:00:11 1997
@@ -92,16 +92,19 @@ 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 */
       sprintf(buf1, "SYSERR: deleting crash file %s (1)", filename);
       perror(buf1);
     }
+    release_buffer(filename);
     return 0;
   }
   fclose(fl);
@@ -112,25 +115,30 @@ int Crash_delete_file(char *name)
       perror(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 */
       sprintf(buf1, "SYSERR: checking for crash file %s (3)", fname);
       perror(buf1);
     }
+    release_buffer(fname);
     return 0;
   }
+  release_buffer(fname);
   if (!feof(fl))
     fread(&rent, sizeof(struct rent_info), 1, fl);
   fclose(fl);
@@ -144,13 +152,16 @@ 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;
   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.
@@ -160,11 +171,13 @@ int Crash_clean_file(char *name)
       sprintf(buf1, "SYSERR: OPENING OBJECT FILE %s (4)", fname);
       perror(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,16 +185,16 @@ 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;
       }
       sprintf(buf, "    Deleting %s's %s file.", name, filetype);
@@ -214,8 +227,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,14 +305,16 @@ 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);
   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"))) {
     if (errno != ENOENT) {	/* if it fails, NOT because of no file */
       sprintf(buf1, "SYSERR: READING OBJECT FILE %s (5)", fname);
@@ -308,8 +325,10 @@ int Crash_load(struct char_data * 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(fname);
     return 1;
   }
+  release_buffer(fname);
   if (!feof(fl))
     fread(&rent, sizeof(struct rent_info), 1, fl);
 
@@ -471,7 +490,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 +498,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 +536,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 +545,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 +599,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 +607,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 +645,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 +653,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))
@@ -672,7 +715,7 @@ void Crash_rent_deadline(struct char_dat
 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 +727,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 +736,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 +751,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 +760,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 +783,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);
diff -uprN ../stk/olc.c ./olc.c
--- ../stk/olc.c	Thu Jun 19 00:58:38 1997
+++ ./olc.c	Sun Aug  3 19:37:41 1997
@@ -69,7 +69,7 @@ char *olc_commands[] = {
 ACMD(do_olc)
 {
   void *olc_targ = NULL;
-  char mode_arg[MAX_INPUT_LENGTH];
+  char *mode_arg;
   int rnum, vnum, olc_mode;
 
   /* WARNING!  **DO NOT** under any circumstances remove the code below!!!!  */
@@ -80,23 +80,27 @@ 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) {
     sprintf(buf, "Invalid mode '%s'.\r\n", mode_arg);
     send_to_char(buf, ch);
     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;
@@ -107,10 +111,12 @@ ACMD(do_olc)
       if ((vnum = atoi(arg)) < 0) {
 	sprintf(buf, "Invalid room vnum '%s'.\r\n", arg);
 	send_to_char(buf, ch);
+        release_buffer(mode_arg);
 	return;
       }
       if ((rnum = real_room(vnum)) == NOWHERE) {
 	send_to_char("No such room!\r\n", ch);
+        release_buffer(mode_arg);
 	return;
       }
     } else {
@@ -131,6 +137,7 @@ ACMD(do_olc)
     if ((vnum = atoi(arg)) < 0) {
       sprintf(buf, "Invalid mob vnum '%s'.\r\n", arg);
       send_to_char(buf, ch);
+      release_buffer(mode_arg);
       return;
     }
     if ((rnum = real_mobile(vnum)) < 0)
@@ -143,6 +150,7 @@ ACMD(do_olc)
     if ((vnum = atoi(arg)) < 0) {
       sprintf(buf, "Invalid obj vnum '%s'\r\n", arg);
       send_to_char(buf, ch);
+      release_buffer(mode_arg);
       return;
     }
     if ((rnum = real_object(vnum)) < 0) {
@@ -153,10 +161,13 @@ ACMD(do_olc)
     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,7 +188,7 @@ 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;
@@ -186,6 +197,7 @@ void olc_interpreter(void *targ, int mod
   if ((command = search_block(command_string, olc_commands, FALSE)) < 0) {
     sprintf(buf, "Invalid OLC command '%s'.\r\n", command_string);
     send_to_char(buf, olc_ch);
+    release_buffer(command_string);
     return;
   }
   switch (mode) {
@@ -201,7 +213,6 @@ void olc_interpreter(void *targ, int mod
   default:
     log("SYSERR: Invalid OLC mode passed to interp.");
     return;
-    break;
   }
 
 
@@ -267,6 +278,7 @@ void olc_interpreter(void *targ, int mod
     }
 
   }
+  release_buffer(command_string);
 }
 
 
diff -uprN ../stk/shop.c ./shop.c
--- ../stk/shop.c	Thu Jun 19 00:58:38 1997
+++ ./shop.c	Sun Aug  3 19:00:29 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);
 }
 
@@ -164,8 +171,9 @@ int find_oper_num(char token)
 
 int evaluate_expression(struct obj_data * obj, char *expr)
 {
+#warning evaluate_expression and down: doesnt release_buffer()
   struct stack_data ops, vals;
-  char *ptr, *end, name[200];
+  char *ptr, *end, *name;
   int temp, index;
 
   if (!expr)
@@ -176,6 +184,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 +225,7 @@ int evaluate_expression(struct obj_data 
     log("Extra operands left on shop keyword expression stack");
     return (FALSE);
   }
+  release_buffer(name);
   return (temp);
 }
 
@@ -299,7 +309,7 @@ int transaction_amt(char *arg)
 
 char *times_message(struct obj_data * obj, char *name, int num)
 {
-  static char buf[256];
+  char *buf = get_buffer(256);
   char *ptr;
 
   if (obj)
@@ -323,7 +333,7 @@ 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);
@@ -368,7 +378,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);
@@ -402,7 +413,8 @@ int buy_price(struct obj_data * obj, int
 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;
 
@@ -513,7 +525,7 @@ void shopping_buy(char *arg, struct char
 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 = get_buffer(MAX_STRING_LENGTH);
   struct obj_data *obj;
   int result;
 
@@ -620,7 +632,9 @@ 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 = get_buffer(200),
+	*buf = get_buffer(MAX_STRING_LENGTH),
+	*name = get_buffer(200);
   struct obj_data *obj, *tag = 0;
   int sellnum, sold = 0, goldamt = 0;
 
@@ -693,9 +707,9 @@ 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 = get_buffer(MAX_STRING_LENGTH);
   struct obj_data *obj;
-  char name[MAX_INPUT_LENGTH];
+  char *name = get_buffer(MAX_INPUT_LENGTH);
 
   if (!(is_ok(keeper, ch, shop_nr)))
     return;
@@ -719,8 +733,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 *buf = get_buffer(256);
+  char *buf2 = get_buffer(300), *buf3 = get_buffer(200);
   extern char *drinks[];
 
   if (shop_producing(obj, shop_nr))
@@ -750,7 +764,7 @@ 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 = get_buffer(MAX_STRING_LENGTH), *name = get_buffer(200);
   struct obj_data *obj, *last_obj = 0;
   int cnt = 0, index = 0;
 
@@ -805,7 +819,7 @@ int ok_shop_room(int shop_nr, int room)
 
 SPECIAL(shop_keeper)
 {
-  char argm[MAX_INPUT_LENGTH];
+  char *argm;
   struct char_data *keeper = (struct char_data *) me;
   int shop_nr;
 
@@ -832,9 +846,11 @@ SPECIAL(shop_keeper)
     return (FALSE);
 
   if (CMD_IS("steal")) {
+    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,7 +873,7 @@ SPECIAL(shop_keeper)
 
 int ok_damage_shopkeeper(struct char_data * ch, struct char_data * victim)
 {
-  char buf[200];
+  char *buf = get_buffer(200);
   int index;
 
   if (IS_NPC(victim) && (mob_index[GET_MOB_RNUM(victim)].func == shop_keeper))
@@ -972,7 +988,7 @@ int read_type_list(FILE * shop_f, struct
 
 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 +1056,7 @@ void boot_the_shops(FILE * shop_f, char 
       free(buf);		/* Plug memory leak! */
     }
   }
+  release_buffer(buf2);
 }
 
 
@@ -1063,7 +1080,7 @@ void assign_the_shopkeepers(void)
 char *customer_string(int shop_nr, int detailed)
 {
   int index, cnt = 1;
-  static char buf[256];
+  char *buf = get_buffer(256);
 
   *buf = 0;
   for (index = 0; *trade_letters[index] != '\n'; index++, cnt *= 2)
diff -uprN ../stk/spec_procs.c ./spec_procs.c
--- ../stk/spec_procs.c	Thu Jun 19 00:58:38 1997
+++ ./spec_procs.c	Sun Aug  3 19:00:46 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);
 }
@@ -614,7 +614,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;
 
diff -uprN ../stk/spell_parser.c ./spell_parser.c
--- ../stk/spell_parser.c	Thu Jun 19 00:58:38 1997
+++ ./spell_parser.c	Wed Jul 23 01:07:39 1997
@@ -211,7 +211,7 @@ 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);
 
   struct char_data *i;
   int j, ofs = 0;
@@ -286,7 +286,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]))
@@ -553,7 +553,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);
@@ -747,12 +747,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 +773,8 @@ void spell_level(int spell, int class, i
 
   if (!bad)    
     spell_info[spell].min_level[class] = level;
+
+  release_buffer(buf);
 }
 
 
diff -uprN ../stk/spells.c ./spells.c
--- ../stk/spells.c	Thu Jun 19 00:58:38 1997
+++ ./spells.c	Mon Jul 28 19:19:51 1997
@@ -181,7 +181,7 @@ ASPELL(spell_summon)
 ASPELL(spell_locate_object)
 {
   struct obj_data *i;
-  char name[MAX_INPUT_LENGTH];
+  char *name = get_buffer(MAX_INPUT_LENGTH);
   int j;
 
   strcpy(name, fname(obj->name));
@@ -214,6 +214,7 @@ ASPELL(spell_locate_object)
 
   if (j == level >> 1)
     send_to_char("You sense nothing.\n\r", ch);
+  release_buffer(name);
 }
 
 
diff -uprN ../stk/utils.c ./utils.c
--- ../stk/utils.c	Thu Jun 19 00:58:39 1997
+++ ./utils.c	Mon Jul 28 13:22:42 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);
@@ -456,6 +463,7 @@ int get_filename(char *orig_name, char *
     break;
   }
 
+  release_buffer(name);
   sprintf(filename, "%s/%s/%s.%s", prefix, middle, name, suffix);
   return 1;
 }
diff -uprN ../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"
