diff --git a/src/sbbs3/umonitor/chat.c b/src/sbbs3/umonitor/chat.c
index 3af08b8df0f15d46add7eb266103c7f75b282141..5a761553b164a3ca4caa2928847016800bd871cd 100644
--- a/src/sbbs3/umonitor/chat.c
+++ b/src/sbbs3/umonitor/chat.c
@@ -138,14 +138,12 @@ int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallbac
 	char	*buf;
 
 	gettextinfo(&ti);
-	if((buf=(char *)malloc(ti.screenwidth*ti.screenheight*2))==NULL) {
+	if((buf=(char *)alloca(ti.screenwidth*ti.screenheight*2))==NULL) {
 		return(-1);
 	}
 
-	if(getnodedat(cfg,nodenum,node,NULL)) {
-		free(buf);
+	if(getnodedat(cfg,nodenum,node,NULL))
 		return(-1);
-	}
 
 	username(cfg,node->useron,usrname);
 
@@ -154,29 +152,24 @@ int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallbac
 
 	sprintf(outpath,"%slchat.dab",cfg->node_path[nodenum-1]);
 	if((out=sopen(outpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
-		,S_IREAD|S_IWRITE))==-1) {
-		free(buf);
+		,S_IREAD|S_IWRITE))==-1)
 		return(-1);
-	}
 
 	sprintf(inpath,"%schat.dab",cfg->node_path[nodenum-1]);
 	if((in=sopen(inpath,O_RDWR|O_CREAT|O_BINARY,O_DENYNONE
 		,S_IREAD|S_IWRITE))==-1) {
 		close(out);
-		free(buf);
 		return(-1);
     }
 
-	if((p=(char *)malloc(PCHAT_LEN))==NULL) {
+	if((p=(char *)alloca(PCHAT_LEN))==NULL) {
 		close(in);
 		close(out);
-		free(buf);
 		return(-1);
     }
 	memset(p,0,PCHAT_LEN);
 	write(in,p,PCHAT_LEN);
 	write(out,p,PCHAT_LEN);
-	free(p);
 	lseek(in,0,SEEK_SET);
 	lseek(out,0,SEEK_SET);
 
@@ -276,7 +269,6 @@ int chat(scfg_t *cfg, int nodenum, node_t *node, box_t *boxch, void(*timecallbac
 		close(out);
 	togglechat(cfg,nodenum,node,FALSE);
 	puttext(1,1,ti.screenwidth,ti.screenheight,buf);
-	free(buf);
 	window(ti.winleft,ti.wintop,ti.winright,ti.wintop);
 	gotoxy(ti.curx,ti.cury);
 	textattr(ti.attribute);
diff --git a/src/sbbs3/umonitor/spyon.c b/src/sbbs3/umonitor/spyon.c
index e46a3987235a5bfe62b0943eb7430cf50ef30743..6e147a061bb614b5bbd15be3265ed864530f851a 100644
--- a/src/sbbs3/umonitor/spyon.c
+++ b/src/sbbs3/umonitor/spyon.c
@@ -83,7 +83,7 @@ int spyon(char *sockname)  {
 	i=1;
 
 	gettextinfo(&ti);
-	scrn=(char *)malloc(ti.screenwidth*ti.screenheight*2);
+	scrn=(char *)alloca(ti.screenwidth*ti.screenheight*2);
 	gettext(1,1,ti.screenwidth,ti.screenheight,scrn);
 	textcolor(YELLOW);
 	textbackground(BLUE);
diff --git a/src/sbbs3/umonitor/umonitor.c b/src/sbbs3/umonitor/umonitor.c
index b89023c69f880f770ab7488c25c55c2b30a789bf..9ed4889e22accc06dd5abfef3adbea8b2996fac6 100644
--- a/src/sbbs3/umonitor/umonitor.c
+++ b/src/sbbs3/umonitor/umonitor.c
@@ -102,16 +102,6 @@ void allocfail(uint size)
     bail(1);
 }
 
-void freeopt(char** opt)
-{
-	int i;
-
-	for(i=0;i<(MAX_OPTS+1);i++)
-		free(opt[i]);
-
-	free(opt);
-}
-
 void node_toggles(scfg_t *cfg,int nodenum)  {
 	int nodefile;
 	char**	opt;
@@ -119,10 +109,10 @@ void node_toggles(scfg_t *cfg,int nodenum)  {
 	node_t	node;
 	int		save=0;
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	i=0;
@@ -186,7 +176,6 @@ void node_toggles(scfg_t *cfg,int nodenum)  {
 		}
 		putnodedat(cfg,nodenum,&node,nodefile);
 	}
-	freeopt(opt);
 }
 
 int dospy(int nodenum, bbs_startup_t *bbs_startup)  {
@@ -425,12 +414,11 @@ int view_log(char *filename, char *title)
 	if(fexist(filename)) {
 		if((buffile=sopen(filename,O_RDONLY,SH_DENYWR))>=0) {
 			j=filelength(buffile);
-			if((buf=(char *)malloc(j+1))!=NULL) {
+			if((buf=(char *)alloca(j+1))!=NULL) {
 				read(buffile,buf,j);
 				close(buffile);
 				*(buf+j)=0;
 				uifc.showbuf(WIN_MID,0,0,76,uifc.scrn_len-2,title,buf,NULL,NULL);
-				free(buf);
 				return(0);
 			}
 			close(buffile);
@@ -459,10 +447,10 @@ int view_logs(scfg_t *cfg)
 	localtime_r(&now,&tm);
 	now -= 60*60*24;
 	localtime_r(&now,&tm_yest);
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	i=0;
@@ -492,7 +480,6 @@ int view_logs(scfg_t *cfg)
 	while(1) {
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"View Logs",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 			case 0:
 				sprintf(str,"%slogs/%2.2d%2.2d%2.2d.lol",cfg->logs_dir,tm.tm_mon+1,tm.tm_mday
@@ -545,11 +532,10 @@ int do_cmd(char *cmd)
 	char *p;
 
 	gettextinfo(&ti);
-	p=malloc(ti.screenheight*ti.screenwidth*2);
+	p=alloca(ti.screenheight*ti.screenwidth*2);
 	gettext(1,1,ti.screenwidth,ti.screenheight,p);
 	i=system(cmd);
 	puttext(1,1,ti.screenwidth,ti.screenheight,p);
-	free(p);
 	return(i);
 }
 
@@ -564,10 +550,10 @@ int qwk_callouts(scfg_t *cfg)
 		return(1);
 	}
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 
@@ -587,7 +573,6 @@ int qwk_callouts(scfg_t *cfg)
 		opt[i][0]=0;
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"QWK Callouts",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 				break;
 			default:
@@ -604,10 +589,10 @@ int run_events(scfg_t *cfg)
 	int		i,j;
 	char	str[1024];
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	if(cfg->total_events<1) {
@@ -630,7 +615,6 @@ int run_events(scfg_t *cfg)
 		opt[i][0]=0;
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Run Events",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 				break;
 			default:
@@ -647,10 +631,10 @@ int recycle_servers(scfg_t *cfg)
 	char **opt;
 	int i=0;
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	i=0;
@@ -671,7 +655,6 @@ int recycle_servers(scfg_t *cfg)
 	while(1) {
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Recycle Servers",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 				break;
 			case 0:
@@ -720,10 +703,10 @@ int edit_cfg(scfg_t *cfg)
 	char	cmd[1024];
 	char	editcmd[1024];
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	i=0;
@@ -750,7 +733,6 @@ int edit_cfg(scfg_t *cfg)
 	while(1) {
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"System Options",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 				break;
 			default:
@@ -769,10 +751,10 @@ int edit_can(scfg_t *cfg)
 	char	cmd[1024];
 	char	editcmd[1024];
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	i=0;
@@ -791,7 +773,6 @@ int edit_can(scfg_t *cfg)
 	while(1) {
 		switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"System Options",opt))  {
 			case -1:
-				freeopt(opt);
 				return(0);
 				break;
 			default:
@@ -969,16 +950,16 @@ int main(int argc, char** argv)  {
 		exit(1);
 	}
 
-	if((opt=(char **)malloc(sizeof(char *)*(MAX_OPTS+1)))==NULL)
+	if((opt=(char **)alloca(sizeof(char *)*(MAX_OPTS+1)))==NULL)
 		allocfail(sizeof(char *)*(MAX_OPTS+1));
 	for(i=0;i<(MAX_OPTS+1);i++)
-		if((opt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((opt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
-	if((mopt=(char **)malloc(sizeof(char *)*MAX_OPTS))==NULL)
+	if((mopt=(char **)alloca(sizeof(char *)*MAX_OPTS))==NULL)
 		allocfail(sizeof(char *)*MAX_OPTS);
 	for(i=0;i<MAX_OPTS;i++)
-		if((mopt[i]=(char *)malloc(MAX_OPLN))==NULL)
+		if((mopt[i]=(char *)alloca(MAX_OPLN))==NULL)
 			allocfail(MAX_OPLN);
 
 	sprintf(title,"Synchronet UNIX Monitor %s-%s",revision,PLATFORM_DESC);