diff --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index 1562f71e8..be81a1d57 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -118,37 +118,27 @@ cexecpipe(int *p0, int *p1) 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) 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 */ 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 @@ filsysinit(Channel *cxfidalloc) /* * 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 @@ filsysmount(Filsys *fs, int id) 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; diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index f02c278ed..a28fb2ccc 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -244,7 +244,7 @@ putsnarf(void) 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 */ diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 9734fd18f..1fd1b671c 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -1420,7 +1420,7 @@ wclosewin(Window *w) void wsetpid(Window *w, int pid, int dolabel) { - char buf[64]; + char buf[32]; int ofd; ofd = w->notefd; @@ -1428,11 +1428,11 @@ wsetpid(Window *w, int pid, int dolabel) 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) diff --git a/sys/src/libc/9sys/access.c b/sys/src/libc/9sys/access.c index c9fee3432..86e459955 100644 --- a/sys/src/libc/9sys/access.c +++ b/sys/src/libc/9sys/access.c @@ -24,7 +24,7 @@ access(char *name, int mode) return 0; return -1; } - fd = open(name, omode[mode&7]); + fd = open(name, omode[mode&7]|OCEXEC); if(fd >= 0){ close(fd); return 0; diff --git a/sys/src/libc/9sys/getenv.c b/sys/src/libc/9sys/getenv.c index 9535708e7..e1c89c1d1 100644 --- a/sys/src/libc/9sys/getenv.c +++ b/sys/src/libc/9sys/getenv.c @@ -18,7 +18,8 @@ getenv(char *name) 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; diff --git a/sys/src/libc/9sys/getnetconninfo.c b/sys/src/libc/9sys/getnetconninfo.c index 8dbb95f89..e21dcc306 100644 --- a/sys/src/libc/9sys/getnetconninfo.c +++ b/sys/src/libc/9sys/getnetconninfo.c @@ -13,7 +13,7 @@ getendpoint(char *dir, char *file, char **sysp, char **servp) 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 @@ getnetconninfo(char *dir, int fd) NetConnInfo *nci; char *cp; Dir *d; - char spec[10]; char path[128]; char netname[128], *p; @@ -76,10 +75,8 @@ getnetconninfo(char *dir, int fd) /* 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); diff --git a/sys/src/libc/9sys/getppid.c b/sys/src/libc/9sys/getppid.c index b90b57ee5..87b878927 100644 --- a/sys/src/libc/9sys/getppid.c +++ b/sys/src/libc/9sys/getppid.c @@ -8,7 +8,7 @@ getppid(void) 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); diff --git a/sys/src/libc/9sys/getwd.c b/sys/src/libc/9sys/getwd.c index ed73cb775..cef4b4796 100644 --- a/sys/src/libc/9sys/getwd.c +++ b/sys/src/libc/9sys/getwd.c @@ -1,14 +1,12 @@ #include #include -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); diff --git a/sys/src/libc/9sys/iounit.c b/sys/src/libc/9sys/iounit.c index 194b17173..02ee77ee4 100644 --- a/sys/src/libc/9sys/iounit.c +++ b/sys/src/libc/9sys/iounit.c @@ -13,7 +13,7 @@ iounit(int fd) 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); diff --git a/sys/src/libc/9sys/postnote.c b/sys/src/libc/9sys/postnote.c index 46564e9ea..12dc7a951 100644 --- 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; diff --git a/sys/src/libc/9sys/procsetname.c b/sys/src/libc/9sys/procsetname.c index 5a75b5147..7b9d41b8e 100644 --- a/sys/src/libc/9sys/procsetname.c +++ b/sys/src/libc/9sys/procsetname.c @@ -8,8 +8,9 @@ procsetname(char *fmt, ...) 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); diff --git a/sys/src/libc/9sys/pushssl.c b/sys/src/libc/9sys/pushssl.c index 8817dd1c3..29eee92a3 100644 --- a/sys/src/libc/9sys/pushssl.c +++ b/sys/src/libc/9sys/pushssl.c @@ -11,7 +11,7 @@ int 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 @@ pushssl(int fd, char *alg, char *secin, char *secout, int *cfd) 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; diff --git a/sys/src/libc/9sys/pushtls.c b/sys/src/libc/9sys/pushtls.c index 345c6b030..07e6c35a4 100644 --- a/sys/src/libc/9sys/pushtls.c +++ b/sys/src/libc/9sys/pushtls.c @@ -42,14 +42,14 @@ int 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 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 @@ pushtls(int fd, char *hashalg, char *encalg, int isclient, char *secret, char *d 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; diff --git a/sys/src/libc/9sys/putenv.c b/sys/src/libc/9sys/putenv.c index a99aaeb5f..034bbf0a7 100644 --- a/sys/src/libc/9sys/putenv.c +++ b/sys/src/libc/9sys/putenv.c @@ -13,7 +13,7 @@ putenv(char *name, char *val) 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); diff --git a/sys/src/libc/9sys/sysname.c b/sys/src/libc/9sys/sysname.c index 1854ddceb..6d8823643 100644 --- a/sys/src/libc/9sys/sysname.c +++ b/sys/src/libc/9sys/sysname.c @@ -10,7 +10,7 @@ sysname(void) 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) diff --git a/sys/src/libc/port/date.c b/sys/src/libc/port/date.c index 7be6cb52f..805302432 100644 --- a/sys/src/libc/port/date.c +++ b/sys/src/libc/port/date.c @@ -174,11 +174,12 @@ loadzone(Tzone *tz, char *name) 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; diff --git a/sys/src/libc/port/getuser.c b/sys/src/libc/port/getuser.c index a987244ee..ff3d2e2a1 100644 --- a/sys/src/libc/port/getuser.c +++ b/sys/src/libc/port/getuser.c @@ -8,7 +8,7 @@ getuser(void) 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); diff --git a/sys/src/libc/port/malloc.c b/sys/src/libc/port/malloc.c index 907bfa8a6..d738cc4b9 100644 --- a/sys/src/libc/port/malloc.c +++ b/sys/src/libc/port/malloc.c @@ -99,13 +99,13 @@ checkenv(void) { 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; diff --git a/sys/src/libc/port/profile.c b/sys/src/libc/port/profile.c index 8a8cd41b3..2a81aebcf 100644 --- a/sys/src/libc/port/profile.c +++ b/sys/src/libc/port/profile.c @@ -137,7 +137,7 @@ _profdump(void) 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 @@ _profmain(void) 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 @@ _profmain(void) 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); diff --git a/sys/src/libdraw/getsubfont.c b/sys/src/libdraw/getsubfont.c index 02634c466..8832aaa11 100644 --- a/sys/src/libdraw/getsubfont.c +++ b/sys/src/libdraw/getsubfont.c @@ -22,7 +22,7 @@ _getsubfont(Display *d, char *name) 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; diff --git a/sys/src/libdraw/init.c b/sys/src/libdraw/init.c index f6f2551db..b02ced89b 100644 --- a/sys/src/libdraw/init.c +++ b/sys/src/libdraw/init.c @@ -49,7 +49,7 @@ geninitdraw(char *devdir, void(*error)(Display*, char*), char *fontname, char *l 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 && nwindir); - 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 @@ gengetwindow(Display *d, char *winname, Image **winp, Screen **scrp, int ref) 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 @@ _closedisplay(Display *disp, int isshutdown) 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); diff --git a/sys/src/libdraw/newwindow.c b/sys/src/libdraw/newwindow.c index 2fb708bef..73306be03 100644 --- a/sys/src/libdraw/newwindow.c +++ b/sys/src/libdraw/newwindow.c @@ -13,7 +13,7 @@ newwindow(char *str) wsys = getenv("wsys"); if(wsys == nil) return -1; - fd = open(wsys, ORDWR); + fd = open(wsys, ORDWR|OCEXEC); if(fd < 0){ free(wsys); return -1; diff --git a/sys/src/libdraw/openfont.c b/sys/src/libdraw/openfont.c index 7e94627a4..6d4aa2d2f 100644 --- a/sys/src/libdraw/openfont.c +++ b/sys/src/libdraw/openfont.c @@ -12,7 +12,7 @@ readfile(char *name) 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; diff --git a/sys/src/libdraw/window.c b/sys/src/libdraw/window.c index 485e14652..44f067d9f 100644 --- a/sys/src/libdraw/window.c +++ b/sys/src/libdraw/window.c @@ -90,7 +90,6 @@ freescreen(Screen *s) d = s->display; a = bufimage(d, 1+4); if(a == nil){ -Error: free(s); return -1; } diff --git a/sys/src/libdraw/writecolmap.c b/sys/src/libdraw/writecolmap.c index 26c1f7f1f..30efdf64a 100644 --- a/sys/src/libdraw/writecolmap.c +++ b/sys/src/libdraw/writecolmap.c @@ -16,7 +16,7 @@ writecolmap(Display *d, RGB *m) 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); diff --git a/sys/src/libthread/id.c b/sys/src/libthread/id.c index 22d60f423..289dc8698 100644 --- a/sys/src/libthread/id.c +++ b/sys/src/libthread/id.c @@ -59,7 +59,7 @@ void threadsetname(char *fmt, ...) { int fd; - char buf[128]; + char buf[32]; va_list arg; Proc *p; Thread *t; @@ -72,8 +72,8 @@ threadsetname(char *fmt, ...) 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); } diff --git a/sys/src/libthread/ioproc.c b/sys/src/libthread/ioproc.c index 32be31026..1ee56c4f3 100644 --- a/sys/src/libthread/ioproc.c +++ b/sys/src/libthread/ioproc.c @@ -19,6 +19,15 @@ iointerrupt(Ioproc *io) 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 @@ xioproc(void *a) 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); diff --git a/sys/src/libthread/kill.c b/sys/src/libthread/kill.c index 9160df016..e7292437c 100644 --- a/sys/src/libthread/kill.c +++ b/sys/src/libthread/kill.c @@ -76,24 +76,31 @@ threadint(int id) threadxxx(id, 0); } +static int +writeprocctl(int pid, char *ctl) +{ + 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) { - char buf[64]; - int fd; - 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);