code: 9ferno

Download patch

ref: f86de033419f1c8733da7d05a9b824bcdb6c3aac
parent: 693f5ff94696f7386d9adb6310b5cebb954bd64f
author: 9ferno <gophone2015@gmail.com>
date: Tue Nov 9 16:36:02 EST 2021

fixed bug when setenv is used with an empty value

--- a/appl/cmd/sh/sh.b
+++ b/appl/cmd/sh/sh.b
@@ -1536,11 +1536,23 @@
 	return ref Listnode(nil, v[0:start]) :: val;
 }
 
+# the correct way to set environment variables is to
+# be able to catch errors if there is a failure.
+# this is not happening and is propogating to a triple fault.
+# the shell should run this in an exception handler
+# When value is nil, setenv() tries to remove the
+# env file. If the file does not already exist,
+# that raises an unhandled exception which is causing a triple
+# fault
 setenv(name: string, val: list of ref Listnode)
 {
 	if (env == nil)
 		return;
-	env->setenv(name, quoted(val, 1));
+	valstr := quoted(val, 1);
+	if(valstr == nil && getenv(name) == nil){
+		return;
+	}
+	env->setenv(name, valstr);
 }
 
 
--- a/dis/init
+++ b/dis/init
@@ -4,9 +4,7 @@
 #	configure boot devices
 #	setup /
 # sh -n /dis/init
-
-# disinit.b does this but not sure why it loses it later
-bind -c '#e' /env
+#	-n to avoid forking the namespace and losing the binds created by disinit.b
 
 load std
 mount {mntgen} /n
--- a/libinterp/xec.c
+++ b/libinterp/xec.c
@@ -7,7 +7,7 @@
 REG	R;			/* Virtual Machine registers */
 String	snil;			/* String known to be zero length */
 
-#define DP	if(1){}else print
+#define DBG	if(0)print
 #define Stmp	*((WORD*)(R.FP+NREG*IBY2WD))
 #define Dtmp	*((WORD*)(R.FP+(NREG+2)*IBY2WD))
 
@@ -220,7 +220,7 @@
 
 	a = A(s);
 	i = W(d);
-	DP("indx a %p a->len %zd i %zd\n", a, a->len, i);
+	DBG("indx a %p a->len %zd i %zd\n", a, a->len, i);
 	if(a == H || i >= a->len){
 	print("indx a %p a->len %zd i %zd\n", a, a->len, i);
 		error(exBounds);
@@ -234,7 +234,7 @@
 
 	a = A(s);
 	i = W(d);
-	DP("indw a %p a->len %zd i %zd\n", a, a->len, i);
+	DBG("indw a %p a->len %zd i %zd\n", a, a->len, i);
 	if(a == H || i >= a->len){
 	print("indw a %p a->len %zd i %zd\n", a, a->len, i);
 		error(exBounds);
@@ -248,7 +248,7 @@
 
 	a = A(s);
 	i = W(d);
-	DP("indf a %p a->len %zd i %zd\n", a, a->len, i);
+	DBG("indf a %p a->len %zd i %zd\n", a, a->len, i);
 	if(a == H || i >= a->len){
 	print("indf a %p a->len %zd i %zd\n", a, a->len, i);
 		error(exBounds);
@@ -262,7 +262,7 @@
 
 	a = A(s);
 	i = W(d);
-	DP("indl a %p a->len %zd i %zd\n", a, a->len, i);
+	DBG("indl a %p a->len %zd i %zd\n", a, a->len, i);
 	if(a == H || i >= a->len){
 	print("indl a %p a->len %zd i %zd\n", a, a->len, i);
 		error(exBounds);
@@ -276,7 +276,7 @@
 
 	a = A(s);
 	i = W(d);
-	DP("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
+	DBG("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
 	if(a == H || i >= a->len){
 	print("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
 		error(exBounds);
@@ -364,7 +364,7 @@
 	R.SP  = nsp;
 	f->t  = t;
 	f->mr = nil;
-	DP("frame frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
+	DBG("frame frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
 		f, t, t->size, R.SP);
 	if (t->np)
 		initmem(t, f);
@@ -398,7 +398,7 @@
 		R.s = t;
 		extend();
 		T(d) = R.s;
-		DP("\t\textended frame at *R.d 0x%p\n", *(intptr**)R.d);
+		DBG("\t\textended frame at *R.d 0x%p\n", *(intptr**)R.d);
 		return;
 	}
 	f = (Frame*)R.SP;
@@ -405,12 +405,12 @@
 	R.SP = nsp;
 	f->t = t;
 	f->mr = nil;
-	DP("\t\tmframe frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
+	DBG("\t\tmframe frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
 		f, t, t->size, R.SP);
 	if (t->np)
 		initmem(t, f);
 	T(d) = f;
-	DP("\t\tframe at *R.d 0x%p is\n", *(intptr**)R.d);
+	DBG("\t\tframe at *R.d 0x%p is\n", *(intptr**)R.d);
 	if(0) showframe((void *)f, t);
 }
 void
@@ -715,7 +715,7 @@
 void
 showREG(void)
 {
-	DP("REG PC 0x%p MP 0x%p FP 0x%p SP 0x%p\n"
+	DBG("REG PC 0x%p MP 0x%p FP 0x%p SP 0x%p\n"
 		"\tTS 0x%p EX 0x%p M 0x%p IC %d\n"
 		"\txpc 0x%p s 0x%p d 0x%p m 0x%p\n",
 		R.PC, R.MP, R.FP, R.SP,
@@ -729,7 +729,7 @@
 
 	showREG();
 	f = (Frame*)R.FP;
-	DP("Frame at 0x%p lr 0x%p fp 0x%p mr 0x%p t 0x%p\n",
+	DBG("Frame at 0x%p lr 0x%p fp 0x%p mr 0x%p t 0x%p\n",
 		f, f->lr, f->fp, f->mr, f->t);
 	/* showframe((void*)f, f->t); */
 	R.FP = f->fp;
@@ -778,7 +778,7 @@
 		error("obsolete dis");
 	}
 
-	DP("\t\tiload module %s for the ldt index %zd\n", n, W(m));
+	DBG("\t\tiload module %s for the ldt index %zd\n", n, W(m));
 	if(strcmp(n, "$self") == 0) {
 		m->ref++;
 		ml = linkmod(m, ldt, 0);
@@ -821,19 +821,19 @@
 	h = D2H(ml);
 	h->ref++;
 
-	DP("\t\tmcall frame at *R.s 0x%p is\n", f);
+	DBG("\t\tmcall frame at *R.s 0x%p is\n", f);
 	if(0 && f->t != nil)
 		showframe((void *)f, f->t);
 	o = W(m);
 	if(o >= 0){
 		l = &ml->links[o].u;
-		DP("\t\tlink o %d %s\n",
+		DBG("\t\tlink o %d %s\n",
 			o, ml->links[o].name);
-		DP("\t\text o %d %s sig 0x%x\n",
+		DBG("\t\text o %d %s sig 0x%x\n",
 			o, ml->m->ext[o].name, ml->m->ext[o].sig);
 	}else{
 		l = &ml->m->ext[-o-1].u;
-		DP("\t\text o %d %s sig 0x%x\n",
+		DBG("\t\text o %d %s sig 0x%x\n",
 			-o-1, ml->m->ext[-o-1].name, ml->m->ext[-o-1].sig);
 	}
 	if(ml->prog == nil) {
@@ -864,11 +864,12 @@
 	WORD l;
 	Array *a;
 
+	DBG("lena R.s 0x%zx\n", R.s);
 	a = A(s);
 	l = 0;
 	if(a != H)
 		l = a->len;
-	DP("lena after A(s) l %zd a->len %zd\n", l, a->len);
+	DBG("lena after A(s) l %zd a->len %zd\n", l, a->len);
 	W(d) = l;
 }
 OP(lenl)
@@ -1733,9 +1734,9 @@
 	Stkext *sx;
 	uchar *fp, *sp, *ex;
 
-	DP("Prog state %d pid %d ticks %lud\n",
+	DBG("Prog state %d pid %d ticks %lud\n",
 		p->state, p->pid, p->ticks);
-	DP("\tpc 0x%p module %s %s\n",
+	DBG("\tpc 0x%p module %s %s\n",
 		p->R.PC, p->R.M->m->name, p->R.M->m->path);
 	sp = p->R.SP;
 	ex = p->R.EX;
@@ -1748,7 +1749,7 @@
 			if(t == nil)
 				t = sx->reg.TR;
 			fp += t->size;
-			DP("\tFrame 0x%p type 0x%p type size %d\n",
+			DBG("\tFrame 0x%p type 0x%p type size %d\n",
 				f, t, t->size);
 		}
 		ex = sx->reg.EX;
@@ -1777,7 +1778,7 @@
 	if(R.M->compiled)
 		comvec();
 	else do {
-		DP("step: %p: %s pid %d state %d %4zd %D:\tR.PC->op=0x%x R.PC->add=0x%x\n",
+		DBG("step: %p: %s pid %d state %d %4zd %D:\tR.PC->op=0x%x R.PC->add=0x%x\n",
 			p, R.M->m->name, p->pid, p->state, R.PC-R.M->prog, R.PC, R.PC->op,
 			R.PC->add);
 		dec[R.PC->add]();
@@ -1784,14 +1785,15 @@
 		op = R.PC->op;
 		R.PC++;
 		optab[op]();
-		DP(" end: %p: ", p);
-		DP("%s ", R.M->m->name);
-		DP("pid %d ", p->pid);
-		DP("state %d", p->state);
-		DP(" %4zd", R.PC-R.M->prog);
-		DP(" %D:\t", R.PC);
-		DP("R.PC->op=0x%x ", R.PC->op);
-		DP("R.PC->add=0x%x\n", R.PC->add);
+/*		DBG(" end: %p: ", p);
+		DBG("%s ", R.M->m->name);
+		DBG("pid %d ", p->pid);
+		DBG("state %d", p->state);
+		DBG(" %4zd", R.PC-R.M->prog);
+		DBG(" %D:\t", R.PC);
+		DBG("R.PC->op=0x%x ", R.PC->op);
+		DBG("R.PC->add=0x%x\n", R.PC->add);
+*/
 	} while(--R.IC != 0);
 
 	p->R = R;
--- a/os/init/disinit.b
+++ b/os/init/disinit.b
@@ -62,13 +62,14 @@
 	#sys->print("srv()\n");
 	#srv();
 
+	# using -n to use this namespace instead of re-creating the binds above
 	sys->print("loading /dis/sh.dis\n");
 	sh := load Sh "/dis/sh.dis";
 	(s, nil) := sys->stat("/dis/init");
 	if(s == 0){
-		sys->print("spawn sh /dis/init\n");
+		sys->print("spawn sh -n -x /dis/init\n");
 		{
-			sh->init(nil, "sh" :: "/dis/init" :: nil);
+			sh->init(nil, "sh" :: "-n" :: "-x" :: "/dis/init" :: nil);
 		} exception e {
 			"*" =>
 				sys->fprint(stderr, "dis/init status: %s\nStarting fallback shell\n", e);
@@ -75,13 +76,13 @@
 				# fallback console
 				sh1 := load Sh "/dis/sh.dis";
 				sys->print("sh -x\n");
-				sh1->init(nil, "sh" :: "-x" :: nil);
+				sh1->init(nil, "sh" :: "-n" :: "-x" :: nil);
 		}
 	}{
 		# fallback console
 		sh1 := load Sh "/dis/sh.dis";
-		sys->print("sh -x\n");
-		sh1->init(nil, "sh" :: "-x" :: nil);
+		sys->print("sh -n -x\n");
+		sh1->init(nil, "sh" :: "-n" :: "-x" :: nil);
 	}
 }
 
--- a/os/pc64/pc64
+++ b/os/pc64/pc64
@@ -176,6 +176,7 @@
 	/nvfs	/
 	/prog	/
 	/tmp	/
+	/proc	/
 	/dis/lib
 	/dis/svc
 	/dis/wm
--- a/os/port/dis.c
+++ b/os/port/dis.c
@@ -9,9 +9,9 @@
 #include <kernel.h>
 #include "raise.h"
 
-#define DP if(1){}else print
+#define DBG if(0)print
 
-	void	vmachine(void*);
+void	vmachine(void*);
 
 struct
 {
@@ -225,9 +225,9 @@
 	Prog **ph;
 
 	if(p->exstr != nil)
-		DP("delprog p->pid %d msg %s p->exstr %s\n", p->pid, msg, p->exstr);
+		DBG("delprog p->pid %d msg %s p->exstr %s\n", p->pid, msg, p->exstr);
 	else
-		DP("delprog p->pid %d msg --%s--\n", p->pid, msg);
+		DBG("delprog p->pid %d msg --%s--\n", p->pid, msg);
 	tellsomeone(p, msg);	/* call before being removed from prog list */
 
 	o = p->osenv;
@@ -288,10 +288,10 @@
 	Osenv *o;
 	int ret;
 
-	DP("tellsomeone pid %d buf %s\n", p->pid, buf);
+	DBG("tellsomeone pid %d buf %s\n", p->pid, buf);
 	if(waserror())
 		return;
-	DP("tellsomeone after waserror() pid %d buf %s\n", p->pid, buf);
+	DBG("tellsomeone after waserror() pid %d buf %s\n", p->pid, buf);
 	o = p->osenv;
 	if(o->childq != nil){
 		ret = qproduce(o->childq, buf, strlen(buf));
@@ -958,7 +958,7 @@
 
 	estr = up->env->errstr;
 	broken = 0;
-	DP("progexit estr %s\n", estr);
+	DBG("progexit estr %s\n", estr);
 	if(estr[0] != '\0' && strcmp(estr, Eintr) != 0 && strncmp(estr, "fail:", 5) != 0)
 		broken = 1;
 
@@ -974,7 +974,7 @@
 	m = R.M->m;
 	if(broken){
 		if(cflag){	/* only works on Plan9 for now */
-			DP("progexit cflag set\n");
+			DBG("progexit cflag set\n");
 			char *pc = strstr(estr, "pc=");
 
 			if(pc != nil)
@@ -984,18 +984,18 @@
 	}
 
 	if(r->exstr != nil)
-		DP("progexit pid %d name %s estr %s exval %p exstr %s\n",
+		DBG("progexit pid %d name %s estr %s exval %p exstr %s\n",
 			r->pid, m->name, estr, r->exval, r->exstr);
 	else
-		DP("progexit pid %d name %s estr %s exval %p\n",
+		DBG("progexit pid %d name %s estr %s exval %p\n",
 			r->pid, m->name, estr, r->exval);
 	// sh.b is matching on fail: not on "<pid> fail: "
 	snprint(msg, sizeof(msg), "%d \"%s\":%s", r->pid, m->name, estr);
 	// snprint(msg, sizeof(msg), "%s", estr);
-	DP("progexit msg %s\n", msg);
+	DBG("progexit msg %s\n", msg);
 
 	if(up->env->debug != nil) {
-		DP("progexit debug set\n");
+		DBG("progexit debug set\n");
 		dbgexit(r, broken, estr);
 		broken = 1;
 		/* must force it to break if in debug */
@@ -1008,7 +1008,6 @@
 		r->state = Pbroken;
 		return;
 	}
-
 	gclock();
 	destroystack(&R);
 	delprog(r, msg);