shithub: riscv

Download patch

ref: b3c9249500d1f6f2df42c1543c4deb87789510b5
parent: a92ffdbbfb3157d6fef23e3a8901c7ecdea68f1b
parent: 4d22dbb0f5a0cd4d3202a01a8cc18b632b5c9b01
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Dec 7 09:33:51 EST 2020

merge

--- a/sys/src/cmd/rio/fsys.c
+++ b/sys/src/cmd/rio/fsys.c
@@ -118,10 +118,9 @@
 Filsys*
 filsysinit(Channel *cxfidalloc)
 {
-	int n, fd, pid, p0;
+	int p0;
 	Filsys *fs;
 	Channel *c;
-	char buf[128];
 
 	fs = emalloc(sizeof(Filsys));
 	if(cexecpipe(&fs->cfd, &fs->sfd) < 0)
@@ -128,20 +127,11 @@
 		goto Rescue;
 	fmtinstall('F', fcallfmt);
 	clockfd = open("/dev/time", OREAD|OCEXEC);
-	fd = open("/dev/user", OREAD);
-	strcpy(buf, "Jean-Paul_Belmondo");
-	if(fd >= 0){
-		n = read(fd, buf, sizeof buf-1);
-		if(n > 0)
-			buf[n] = 0;
-		close(fd);
-	}
-	fs->user = estrdup(buf);
+	fs->user = getuser();
 	fs->csyncflush = chancreate(sizeof(int), 0);
 	if(fs->csyncflush == nil)
 		error("chancreate syncflush");
 	fs->cxfidalloc = cxfidalloc;
-	pid = getpid();
 
 	/*
 	 * Create and post wctl pipe
@@ -148,7 +138,7 @@
 	 */
 	if(cexecpipe(&p0, &wctlfd) < 0)
 		goto Rescue;
-	snprint(srvwctl, sizeof(srvwctl), "/srv/riowctl.%s.%d", fs->user, pid);
+	snprint(srvwctl, sizeof(srvwctl), "/srv/riowctl.%s.%lud", fs->user, (ulong)getpid());
 	post(srvwctl, "wctl", p0);
 	close(p0);
 
@@ -165,7 +155,7 @@
 	/*
 	 * Post srv pipe
 	 */
-	snprint(srvpipe, sizeof(srvpipe), "/srv/rio.%s.%d", fs->user, pid);
+	snprint(srvpipe, sizeof(srvpipe), "/srv/rio.%s.%lud", fs->user, (ulong)getpid());
 	post(srvpipe, "wsys", fs->cfd);
 
 	return fs;
@@ -234,7 +224,7 @@
 	char buf[32];
 
 	close(fs->sfd);	/* close server end so mount won't hang if exiting */
-	sprint(buf, "%d", id);
+	snprint(buf, sizeof buf, "%d", id);
 	if(mount(fs->cfd, -1, "/mnt/wsys", MREPL, buf) == -1){
 		fprint(2, "mount failed: %r\n");
 		return -1;
--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -244,7 +244,7 @@
 
 	if(snarffd<0 || nsnarf==0)
 		return;
-	fd = open("/dev/snarf", OWRITE);
+	fd = open("/dev/snarf", OWRITE|OCEXEC);
 	if(fd < 0)
 		return;
 	/* snarf buffer could be huge, so fprint will truncate; do it in blocks */
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -1420,7 +1420,7 @@
 void
 wsetpid(Window *w, int pid, int dolabel)
 {
-	char buf[64];
+	char buf[32];
 	int ofd;
 
 	ofd = w->notefd;
@@ -1428,11 +1428,11 @@
 		w->notefd = -1;
 	else {
 		if(dolabel){
-			snprint(buf, sizeof(buf), "rc %d", pid);
+			snprint(buf, sizeof(buf), "rc %lud", (ulong)pid);
 			free(w->label);
 			w->label = estrdup(buf);
 		}
-		snprint(buf, sizeof(buf), "/proc/%d/notepg", pid);
+		snprint(buf, sizeof(buf), "/proc/%lud/notepg", (ulong)pid);
 		w->notefd = open(buf, OWRITE|OCEXEC);
 	}
 	if(ofd >= 0)
--- a/sys/src/libc/9sys/access.c
+++ b/sys/src/libc/9sys/access.c
@@ -24,7 +24,7 @@
 			return 0;
 		return -1;
 	}
-	fd = open(name, omode[mode&7]);
+	fd = open(name, omode[mode&7]|OCEXEC);
 	if(fd >= 0){
 		close(fd);
 		return 0;
--- a/sys/src/libc/9sys/getenv.c
+++ b/sys/src/libc/9sys/getenv.c
@@ -18,7 +18,8 @@
 	snprint(s, HUNK, "/env/%s", name);
 	n = 0;
 	r = -1;
-	if((f = open(s, OREAD)) >= 0){
+	f = open(s, OREAD|OCEXEC);
+	if(f >= 0){
 		while((r = read(f, s+n, HUNK)) > 0){
 			n += r;
 			r = -1;
--- a/sys/src/libc/9sys/getnetconninfo.c
+++ b/sys/src/libc/9sys/getnetconninfo.c
@@ -13,7 +13,7 @@
 	sys = serv = 0;
 
 	snprint(buf, sizeof buf, "%s/%s", dir, file);
-	fd = open(buf, OREAD);
+	fd = open(buf, OREAD|OCEXEC);
 	if(fd >= 0){
 		n = read(fd, buf, sizeof(buf)-1);
 		if(n>0){
@@ -41,7 +41,6 @@
 	NetConnInfo *nci;
 	char *cp;
 	Dir *d;
-	char spec[10];
 	char path[128];
 	char netname[128], *p;
 
@@ -76,10 +75,8 @@
 
 	/* figure out bind spec */
 	d = dirstat(nci->dir);
-	if(d != nil){
-		sprint(spec, "#%C%d", d->type, d->dev);
-		nci->spec = strdup(spec);
-	}
+	if(d != nil)
+		nci->spec = smprint("#%C%d", d->type, d->dev);
 	if(nci->spec == nil)
 		nci->spec = unknown;
 	free(d);
--- a/sys/src/libc/9sys/getppid.c
+++ b/sys/src/libc/9sys/getppid.c
@@ -8,7 +8,7 @@
 	int f;
 
 	memset(b, 0, sizeof(b));
-	f = open("/dev/ppid", 0);
+	f = open("/dev/ppid", OREAD|OCEXEC);
 	if(f >= 0) {
 		read(f, b, sizeof(b));
 		close(f);
--- a/sys/src/libc/9sys/getwd.c
+++ b/sys/src/libc/9sys/getwd.c
@@ -1,14 +1,12 @@
 #include <u.h>
 #include <libc.h>
 
-static char *nsgetwd(char*, int);
-
 char*
 getwd(char *buf, int nbuf)
 {
 	int n, fd;
 
-	fd = open(".", OREAD);
+	fd = open(".", OREAD|OCEXEC);
 	if(fd < 0)
 		return nil;
 	n = fd2path(fd, buf, nbuf);
--- a/sys/src/libc/9sys/iounit.c
+++ b/sys/src/libc/9sys/iounit.c
@@ -13,7 +13,7 @@
 	char buf[128], *args[10];
 
 	snprint(buf, sizeof buf, "#d/%dctl", fd);
-	cfd = open(buf, OREAD);
+	cfd = open(buf, OREAD|OCEXEC);
 	if(cfd < 0)
 		return 0;
 	i = read(cfd, buf, sizeof buf-1);
--- a/sys/src/libc/9sys/postnote.c
+++ b/sys/src/libc/9sys/postnote.c
@@ -4,21 +4,21 @@
 int
 postnote(int group, int pid, char *note)
 {
-	char file[128];
+	char file[32];
 	int f, r;
 
 	switch(group) {
 	case PNPROC:
-		sprint(file, "/proc/%d/note", pid);
+		snprint(file, sizeof(file), "/proc/%lud/note", (ulong)pid);
 		break;
 	case PNGROUP:
-		sprint(file, "/proc/%d/notepg", pid);
+		snprint(file, sizeof(file), "/proc/%lud/notepg", (ulong)pid);
 		break;
 	default:
 		return -1;
 	}
 
-	f = open(file, OWRITE);
+	f = open(file, OWRITE|OCEXEC);
 	if(f < 0)
 		return -1;
 
--- a/sys/src/libc/9sys/procsetname.c
+++ b/sys/src/libc/9sys/procsetname.c
@@ -8,8 +8,9 @@
 	char buf[128];
 	va_list arg;
 
-	snprint(buf, sizeof buf, "#p/%lud/args", (ulong)getpid());
-	if((fd = open(buf, OWRITE)) < 0)
+	snprint(buf, sizeof buf, "/proc/%lud/args", (ulong)getpid());
+	fd = open(buf, OWRITE|OCEXEC);
+	if(fd < 0)
 		return;
 	va_start(arg, fmt);
 	n = vsnprint(buf, sizeof buf, fmt, arg);
--- a/sys/src/libc/9sys/pushssl.c
+++ b/sys/src/libc/9sys/pushssl.c
@@ -11,7 +11,7 @@
 pushssl(int fd, char *alg, char *secin, char *secout, int *cfd)
 {
 	char buf[8];
-	char dname[64];
+	char dname[32];
 	int n, data, ctl;
 
 	ctl = open("#D/ssl/clone", ORDWR);
@@ -21,7 +21,7 @@
 	if(n < 0)
 		goto error;
 	buf[n] = 0;
-	sprint(dname, "#D/ssl/%s/data", buf);
+	snprint(dname, sizeof(dname), "#D/ssl/%s/data", buf);
 	data = open(dname, ORDWR);
 	if(data < 0)
 		goto error;
--- a/sys/src/libc/9sys/pushtls.c
+++ b/sys/src/libc/9sys/pushtls.c
@@ -42,7 +42,7 @@
 pushtls(int fd, char *hashalg, char *encalg, int isclient, char *secret, char *dir)
 {
 	char buf[8];
-	char dname[64];
+	char dname[32];
 	int n, data, ctl, hand;
 
 	// open a new filter; get ctl fd
@@ -49,7 +49,7 @@
 	data = hand = -1;
 	// /net/tls uses decimal file descriptors to name channels, hence a
 	// user-level file server can't stand in for #a; may as well hard-code it.
-	ctl = open("#a/tls/clone", ORDWR);
+	ctl = open("#a/tls/clone", ORDWR|OCEXEC);
 	if(ctl < 0)
 		goto error;
 	n = read(ctl, buf, sizeof(buf)-1);
@@ -60,14 +60,14 @@
 		sprint(dir, "#a/tls/%s", buf);
 
 	// get application fd
-	sprint(dname, "#a/tls/%s/data", buf);
+	snprint(dname, sizeof(dname), "#a/tls/%s/data", buf);
 	data = open(dname, ORDWR);
 	if(data < 0)
 		goto error;
 
 	// get handshake fd
-	sprint(dname, "#a/tls/%s/hand", buf);
-	hand = open(dname, ORDWR);
+	snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf);
+	hand = open(dname, ORDWR|OCEXEC);
 	if(hand < 0)
 		goto error;
 
--- a/sys/src/libc/9sys/putenv.c
+++ b/sys/src/libc/9sys/putenv.c
@@ -13,7 +13,7 @@
 		return -1;
 	}
 	snprint(ename, sizeof(ename), "/env/%s", name);
-	f = create(ename, OWRITE, 0664);
+	f = create(ename, OWRITE|OCEXEC, 0664);
 	if(f < 0)
 		return -1;
 	n = strlen(val);
--- a/sys/src/libc/9sys/sysname.c
+++ b/sys/src/libc/9sys/sysname.c
@@ -10,7 +10,7 @@
 	if(b[0])
 		return b;
 
-	f = open("#c/sysname", 0);
+	f = open("/dev/sysname", OREAD|OCEXEC);
 	if(f >= 0) {
 		n = read(f, b, sizeof(b)-1);
 		if(n > 0)
--- a/sys/src/libc/port/date.c
+++ b/sys/src/libc/port/date.c
@@ -174,11 +174,12 @@
 	else
 		snprint(path, sizeof(path), "/adm/timezone/%s", name);
 	memset(buf, 0, sizeof(buf));
-	if((f = open(path, 0)) == -1)
+	f = open(path, OREAD|OCEXEC);
+	if(f < 0)
 		return -1;
 	r = read(f, buf, sizeof(buf));
 	close(f);
-	if(r == sizeof(buf) || r == -1)
+	if(r < 0 || r >= sizeof(buf))
 		return -1;
 	buf[r] = 0;
 	p = buf;
--- a/sys/src/libc/port/getuser.c
+++ b/sys/src/libc/port/getuser.c
@@ -8,7 +8,7 @@
 	int fd;
 	int n;
 
-	fd = open("/dev/user", OREAD);
+	fd = open("/dev/user", OREAD|OCEXEC);
 	if(fd < 0)
 		return "none";
 	n = read(fd, user, (sizeof user)-1);
--- a/sys/src/libc/port/malloc.c
+++ b/sys/src/libc/port/malloc.c
@@ -99,13 +99,13 @@
 {
 	int n, fd;
 	char buf[20];
-	fd = open("/env/MALLOCFD", OREAD);
+	fd = open("/env/MALLOCFD", OREAD|OCEXEC);
 	if(fd < 0)
 		return -1;
-	if((n = read(fd, buf, sizeof buf)) < 0) {
-		close(fd);
+	n = read(fd, buf, sizeof buf);
+	close(fd);
+	if(n < 0)
 		return -1;
-	}
 	if(n >= sizeof buf)
 		n = sizeof(buf)-1;
 	buf[n] = 0;
--- a/sys/src/libc/port/profile.c
+++ b/sys/src/libc/port/profile.c
@@ -137,7 +137,7 @@
 		snprint(filename, sizeof filename - 1, "prof.%ld", _tos->prof.pid);
 	else
 		snprint(filename, sizeof filename - 1, "prof.out");
-	f = create(filename, 1, 0666);
+	f = create(filename, OWRITE|OCEXEC, 0666);
 	if(f < 0) {
 		perror("create prof.out");
 		return;
@@ -245,7 +245,7 @@
 		khz = _tos->cyclefreq / 1000;	/* Report times in milliseconds */
 		havecycles = 1;
 	}
-	f = open("/env/profsize", OREAD);
+	f = open("/env/profsize", OREAD|OCEXEC);
 	if(f >= 0) {
 		memset(ename, 0, sizeof(ename));
 		read(f, ename, sizeof(ename)-1);
@@ -253,7 +253,7 @@
 		n = atol(ename);
 	}
 	_tos->prof.what = Profuser;
-	f = open("/env/proftype", OREAD);
+	f = open("/env/proftype", OREAD|OCEXEC);
 	if(f >= 0) {
 		memset(ename, 0, sizeof(ename));
 		read(f, ename, sizeof(ename)-1);
--- a/sys/src/libdraw/getsubfont.c
+++ b/sys/src/libdraw/getsubfont.c
@@ -22,7 +22,7 @@
 	if(dolock)
 		unlockdisplay(d);
 
-	fd = open(name, OREAD);
+	fd = open(name, OREAD|OCEXEC);
 	if(fd < 0) {
 		fprint(2, "getsubfont: can't open %s: %r\n", name);
 		f = nil;
--- a/sys/src/libdraw/init.c
+++ b/sys/src/libdraw/init.c
@@ -49,7 +49,7 @@
 		return -1;
 	}
 	if(fontname == nil){
-		fd = open("/env/font", OREAD);
+		fd = open("/env/font", OREAD|OCEXEC);
 		if(fd >= 0){
 			n = read(fd, buf, sizeof(buf));
 			if(n>0 && n<sizeof buf-1){
@@ -82,11 +82,11 @@
 	 */
 	if(label != nil){
 		snprint(buf, sizeof buf, "%s/label", display->windir);
-		fd = open(buf, OREAD);
+		fd = open(buf, OREAD|OCEXEC);
 		if(fd >= 0){
 			read(fd, display->oldlabel, (sizeof display->oldlabel)-1);
 			close(fd);
-			fd = create(buf, OWRITE, 0666);
+			fd = create(buf, OWRITE|OCEXEC, 0666);
 			if(fd >= 0){
 				write(fd, label, strlen(label));
 				close(fd);
@@ -125,7 +125,7 @@
 
 	obuf[0] = 0;
 retry:
-	fd = open(winname, OREAD);
+	fd = open(winname, OREAD|OCEXEC);
 	if(fd<0 || (n=read(fd, buf, sizeof buf-1))<=0){
 		if(fd >= 0) close(fd);
 		strcpy(buf, "noborder");
@@ -345,7 +345,7 @@
 		display = nil;
 	if(disp->oldlabel[0]){
 		snprint(buf, sizeof buf, "%s/label", disp->windir);
-		fd = open(buf, OWRITE);
+		fd = open(buf, OWRITE|OCEXEC);
 		if(fd >= 0){
 			write(fd, disp->oldlabel, strlen(disp->oldlabel));
 			close(fd);
--- a/sys/src/libdraw/newwindow.c
+++ b/sys/src/libdraw/newwindow.c
@@ -13,7 +13,7 @@
 	wsys = getenv("wsys");
 	if(wsys == nil)
 		return -1;
-	fd = open(wsys, ORDWR);
+	fd = open(wsys, ORDWR|OCEXEC);
 	if(fd < 0){
 		free(wsys);
 		return -1;
--- a/sys/src/libdraw/openfont.c
+++ b/sys/src/libdraw/openfont.c
@@ -12,7 +12,7 @@
 	n = 0;
 	r = -1;
 	if((s = malloc(HUNK)) != nil){
-		if((f = open(name, OREAD)) >= 0){
+		if((f = open(name, OREAD|OCEXEC)) >= 0){
 			while((r = read(f, s+n, HUNK)) > 0){
 				n += r;
 				r = -1;
--- a/sys/src/libdraw/window.c
+++ b/sys/src/libdraw/window.c
@@ -90,7 +90,6 @@
 	d = s->display;
 	a = bufimage(d, 1+4);
 	if(a == nil){
-Error:
 		free(s);
 		return -1;
 	}
--- a/sys/src/libdraw/writecolmap.c
+++ b/sys/src/libdraw/writecolmap.c
@@ -16,7 +16,7 @@
 	ulong r, g, b;
 
 	sprint(buf, "/dev/draw/%d/colormap", d->dirno);
-	fd = open(buf, OWRITE);
+	fd = open(buf, OWRITE|OCEXEC);
 	if(fd < 0)
 		drawerror(d, "writecolmap: open colormap failed");
 	t = malloc(8192);
--- a/sys/src/libthread/id.c
+++ b/sys/src/libthread/id.c
@@ -59,7 +59,7 @@
 threadsetname(char *fmt, ...)
 {
 	int fd;
-	char buf[128];
+	char buf[32];
 	va_list arg;
 	Proc *p;
 	Thread *t;
@@ -72,8 +72,8 @@
 	t->cmdname = vsmprint(fmt, arg);
 	va_end(arg);
 	if(t->cmdname && p->nthreads == 1){
-		snprint(buf, sizeof buf, "#p/%lud/args", _tos->pid); //getpid());
-		if((fd = open(buf, OWRITE)) >= 0){
+		snprint(buf, sizeof buf, "/proc/%lud/args", (ulong)getpid());
+		if((fd = open(buf, OWRITE|OCEXEC)) >= 0){
 			write(fd, t->cmdname, strlen(t->cmdname)+1);
 			close(fd);
 		}
--- a/sys/src/libthread/ioproc.c
+++ b/sys/src/libthread/ioproc.c
@@ -19,6 +19,15 @@
 	qunlock(io);
 }
 
+static int
+openprocctl(void)
+{
+	char buf[32];
+
+	snprint(buf, sizeof(buf), "/proc/%lud/ctl", (ulong)getpid());
+	return open(buf, OWRITE|OCEXEC);
+}
+
 static void
 xioproc(void *a)
 {
@@ -28,15 +37,11 @@
 
 	c = a;
 	if(io = mallocz(sizeof(*io), 1)){
-		char buf[128];
-
 		/*
 		 * open might fail, ignore it for programs like factotum
 		 * that don't use iointerrupt() anyway.
 		 */
-		snprint(buf, sizeof(buf), "/proc/%d/ctl", getpid());
-		io->ctl = open(buf, OWRITE);
-
+		io->ctl = openprocctl();
 		if((io->creply = chancreate(sizeof(void*), 0)) == nil){
 			if(io->ctl >= 0)
 				close(io->ctl);
--- a/sys/src/libthread/kill.c
+++ b/sys/src/libthread/kill.c
@@ -76,24 +76,31 @@
 	threadxxx(id, 0);
 }
 
-static void
-tinterrupt(Proc *p, Thread *t)
+static int
+writeprocctl(int pid, char *ctl)
 {
-	char buf[64];
+	char buf[32];
 	int fd;
 
+	snprint(buf, sizeof(buf), "/proc/%lud/ctl", (ulong)pid);
+	fd = open(buf, OWRITE|OCEXEC);
+	if(fd < 0)
+		return -1;
+	if(write(fd, ctl, strlen(ctl)) < 0){
+		close(fd);
+		return -1;
+	}
+	close(fd);
+	return 0;
+}
+
+static void
+tinterrupt(Proc *p, Thread *t)
+{
 	switch(t->state){
 	case Running:
-		snprint(buf, sizeof(buf), "/proc/%d/ctl", p->pid);
-		fd = open(buf, OWRITE|OCEXEC);
-		if(fd >= 0){
-			if(write(fd, "interrupt", 9) == 9){
-				close(fd);
-				break;
-			}
-			close(fd);
-		}
-		postnote(PNPROC, p->pid, "threadint");
+		if(writeprocctl(p->pid, "interrupt") < 0)
+			postnote(PNPROC, p->pid, "threadint");
 		break;
 	case Rendezvous:
 		_threadflagrendez(t);