Various impossible tests. [rsc] --rw-rw-r-- M 84741 glenda sys 25819 Dec 11 07:50 sys/src/cmd/5l/obj.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/5l/obj.c:819,825 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/5l/obj.c:819,825 bloc += r; c -= r; - if(p->reg < 0 || p->reg > NREG) + if(p->reg > NREG) diag("register out of range %d", p->reg); p->link = P; [rsc] --rw-rw-r-- M 84741 glenda sys 9664 Dec 11 07:50 sys/src/cmd/9660srv/main.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/9660srv/main.c:181,187 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/9660srv/main.c:181,187 errno = 0; if(!waserror()){ err_msg[0] = 0; - if(req->type < 0 || req->type > nelem(fcalls) || !fcalls[req->type]) + if(req->type >= nelem(fcalls) || !fcalls[req->type]) error("bad fcall type"); (*fcalls[req->type])(); poperror(); [rsc] --rw-rw-r-- M 84741 glenda sys 20200 Dec 11 07:50 sys/src/cmd/aux/consolefs.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/aux/consolefs.c:986,992 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/aux/consolefs.c:986,992 return; } - if(r->f.count < 0){ + if((int)r->f.count < 0){ fsreply(fs, r, Ebadcount); return; } /n/sourcesdump/2005/1211/plan9/sys/src/cmd/aux/consolefs.c:1045,1051 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/aux/consolefs.c:1045,1051 return; } - if(r->f.count < 0){ + if((int)r->f.count < 0){ fsreply(fs, r, Ebadcount); return; } /n/sourcesdump/2005/1211/plan9/sys/src/cmd/aux/consolefs.c:1112,1118 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/aux/consolefs.c:1112,1118 void fsstat(Fs *fs, Request *r, Fid *f) { - int i; + int i, n; Qid q; Dir d; /n/sourcesdump/2005/1211/plan9/sys/src/cmd/aux/consolefs.c:1119,1129 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/aux/consolefs.c:1119,1130 q = parentqid(f->qid); for(i = 0; ; i++){ r->f.stat = r->buf+IOHDRSZ; - r->f.nstat = fsdirgen(fs, q, i, &d, r->f.stat, messagesize-IOHDRSZ); - if(r->f.nstat < 0){ + n = fsdirgen(fs, q, i, &d, r->f.stat, messagesize-IOHDRSZ); + if(n < 0){ fsreply(fs, r, Eexist); return; } + r->f.nstat = n; if(r->f.nstat > BIT16SZ && d.qid.path == f->qid.path) break; } [rsc] --rw-rw-r-- M 84741 glenda sys 25880 Dec 11 07:50 sys/src/cmd/aux/depend.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/aux/depend.c:828,834 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/aux/depend.c:828,834 fsreply(fs, r, Enofid); return; } - if(r->f.count < 0){ + if((int)r->f.count < 0){ fsreply(fs, r, "bad read count"); return; } [rsc] --rw-rw-r-- M 84741 glenda sys 16526 Dec 11 07:50 sys/src/cmd/cfs/cfs.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/cfs/cfs.c:373,379 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/cfs/cfs.c:373,379 return; } if(c.thdr.newfid != c.thdr.fid){ - if(c.thdr.newfid<0 || Nfid<=c.thdr.newfid) + if(c.thdr.newfid >= Nfid) error("clone nfid out of range"); nmf = &mfile[c.thdr.newfid]; if(nmf->busy) /n/sourcesdump/2005/1211/plan9/sys/src/cmd/cfs/cfs.c:477,483 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/cfs/cfs.c:477,483 c.rhdr.count = statlen-off; else c.rhdr.count = cnt; - if(c.rhdr.count < 0){ + if((int)c.rhdr.count < 0){ sendreply("eof"); return; } /n/sourcesdump/2005/1211/plan9/sys/src/cmd/cfs/cfs.c:787,793 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/cfs/cfs.c:787,793 if((rlen = convM2S(datarcv, p->len, f)) != p->len) error("rcvmsg format error, expected length %d, got %d", rlen, p->len); - if(f->fid<0 || Nfid<=f->fid){ + if(f->fid >= Nfid){ fprint(2, "<-%s: %d %s on %d\n", p->name, f->type, mname[f->type]? mname[f->type] : "mystery", f->fid); [rsc] --rw-rw-r-- M 84741 glenda sys 6878 Dec 11 07:50 sys/src/cmd/db/format.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/db/format.c:273,288 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/db/format.c:273,290 case 'I': case 'i': - dotinc = machdata->das(map, dot, modifier, buf, sizeof(buf)); - if (dotinc < 0) + i = machdata->das(map, dot, modifier, buf, sizeof(buf)); + if (i < 0) error("%r"); + dotinc = i; dprint("%s\n", buf); break; case 'M': - dotinc = machdata->hexinst(map, dot, buf, sizeof(buf)); - if (dotinc < 0) + i = machdata->hexinst(map, dot, buf, sizeof(buf)); + if (i < 0) error("%r"); + dotinc = i; dprint("%s", buf); if (*fp) { dotinc = 0; [rsc] --rw-rw-r-- M 84741 glenda sys 17649 Dec 11 07:50 sys/src/cmd/disk/format.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/disk/format.c:630,636 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/disk/format.c:630,636 fatal("open %s: %r", *argv); if((d = dirfstat(sysfd)) == nil) fatal("stat %s: %r", *argv); - if(d->length > 0xFFFFFFFF) + if(d->length > 0xFFFFFFFFU) fatal("file %s too big\n", *argv, d->length); if(commit) print("Adding file %s, length %lld\n", *argv, d->length); [rsc] --rw-rw-r-- M 84741 glenda sys 11914 Dec 11 10:48 sys/src/cmd/exportfs/exportsrv.c [rsc] --rw-rw-r-- M 84741 glenda sys 9616 Dec 11 07:50 sys/src/cmd/iostats/iostats.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/iostats/iostats.c:174,182 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/iostats/iostats.c:174,179 stats->nrpc++; stats->nproto += n; - if(r->work.fid < 0) - fatal("fid out of range"); - DEBUG(2, "%F\n", &r->work); type = r->work.type; [rsc] --rw-rw-r-- M 84741 glenda sys 33088 Dec 11 07:50 sys/src/cmd/ip/ftpd.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/ip/ftpd.c:248,254 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/ip/ftpd.c:248,254 /* * get rid of telnet control sequences (we don't need them) */ - while(*cmd && *cmd == Iac){ + while(*cmd && (uchar)*cmd == Iac){ cmd++; if(*cmd) cmd++; [rsc] --rw-rw-r-- M 84741 glenda sys 33083 Dec 11 07:50 sys/src/cmd/ndb/cs.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/ndb/cs.c:432,439 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/ndb/cs.c:432,437 freejob(job); continue; } - if(job->request.fid<0) - error("fid out of range"); lock(&dblock); mf = newfid(job->request.fid); if(debug) /n/sourcesdump/2005/1211/plan9/sys/src/cmd/ndb/cs.c:563,572 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/ndb/cs.c:561,566 if(job->request.newfid != job->request.fid){ /* clone fid */ - if(job->request.newfid<0){ - err = "clone newfid out of range"; - goto send; - } nmf = newfid(job->request.newfid); if(nmf->busy){ nmf = nil; [rsc] --rw-rw-r-- M 84741 rsc sys 41974 Dec 11 07:50 sys/src/cmd/vnc/devdraw.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/vnc/devdraw.c:2081,2090 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/vnc/devdraw.c:2081,2086 if(active){ drawblankscreen(0); sdraw.blanktime = 0; - }else{ - if(blanktime && TK2SEC(sdraw.blanktime)/60 >= blanktime) - drawblankscreen(1); - else - sdraw.blanktime++; - } + }else + sdraw.blanktime++; } [rsc] --rw-rw-r-- M 84741 glenda sys 25287 Dec 11 19:08 sys/src/cmd/ql/obj.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/ql/obj.c:434,440 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/ql/obj.c:434,440 a->name = p[3]; c = 4; - if(a->reg < 0 || a->reg > NREG) { + if(a->reg > NREG) { print("register out of range %d\n", a->reg); p[0] = AEND+1; return 0; /* force real diagnostic */ [rsc] --rw-rw-r-- M 84741 glenda sys 11453 Dec 11 07:50 sys/src/cmd/srvold9p/9p1lib.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/srvold9p/9p1lib.c:149,155 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/srvold9p/9p1lib.c:149,155 if(count > DUMPL) count = DUMPL; for(i=0; i127) + if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127) printable = 0; p = ans; *p++ = '\''; [rsc] --rw-rw-r-- M 84741 glenda sys 13635 Dec 11 07:50 sys/src/cmd/vac/vacfs.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/vac/vacfs.c:519,529 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/vac/vacfs.c:519,530 cnt = rhdr.count; if(f->qid.type & QTDIR) return "file is a directory"; - thdr.count = vfWrite(vf, buf, cnt, off, "none"); - if(thdr.count < 0) { + cnt = vfWrite(vf, buf, cnt, off, "none"); + if(cnt < 0) { fprint(2, "write failed: %s\n", vtGetError()); return vtGetError(); } + thdr.count = cnt; return 0; } [rsc] --rw-rw-r-- M 84741 glenda sys 21135 Dec 11 07:50 sys/src/cmd/cpu.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/cpu.c:921,927 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/cpu.c:921,927 fprint(2, "read9pmsg(%d) returns %d: %r\n", fd, n); break; } - if(convM2S(buf, n, &f) < 0) + if(convM2S(buf, n, &f) <= BIT16SZ) break; if(dbg) fprint(2, "->%F\n", &f); [rsc] --rw-rw-r-- M 84741 rsc sys 38683 Dec 11 07:50 sys/src/cmd/ext2srv/ext2subs.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/ext2srv/ext2subs.c:1449,1455 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/ext2srv/ext2subs.c:1449,1455 es = getext2(xf, EXT2_SUPER, 0); /* get dir inode */ - if( file->pinbr < 0 || file->pinbr > es.u.sb->s_inodes_count ){ + if( file->pinbr >= es.u.sb->s_inodes_count ){ chat("inode number %d is too big...", file->pinbr); putext2(es); errno = Eintern; [rsc] --rw-rw-r-- M 84741 rsc sys 33320 Dec 11 07:50 sys/src/cmd/fossil/9fsys.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/fossil/9fsys.c:1222,1228 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/fossil/9fsys.c:1222,1228 } if(strcmp(argv[5], "-") != 0){ de.size = strtoull(argv[5], &p, 0); - if(argv[5][0] == '\0' || *p != '\0' || de.size < 0){ + if(argv[5][0] == '\0' || *p != '\0' || (vlong)de.size < 0){ vtSetError("console wstat - bad length"); goto error; } [rsc] --rw-rw-r-- M 84741 glenda sys 29820 Dec 11 07:50 sys/src/cmd/scat/scat.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/scat/scat.c:1288,1294 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/scat/scat.c:1288,1294 if(t == s) goto BadCoords; /* degree sign etc. is optional */ - if(*t == L'°') + if((uchar)*t == L'°') deg = DEG(getra(s)); if(doreset) reset(); [rsc] --rw-rw-r-- M 84741 glenda sys 38986 Dec 11 07:50 sys/src/cmd/tweak.c /n/sourcesdump/2005/1211/plan9/sys/src/cmd/tweak.c:1165,1171 - /n/sourcesdump/2005/1212/plan9/sys/src/cmd/tweak.c:1165,1171 cntledit(char *tag) { char buf[256]; - ulong l; + long l; buttons(Up); if(type(buf, tag) == 0) [rsc] --rw-rw-r-- M 84741 glenda sys 17110 Dec 11 16:07 sys/src/lib9p/srv.c /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:5,10 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:5,12 #include #include <9p.h> + void (*_forker)(void(*)(void*), void*, int); + static char Ebadattach[] = "unknown specifier in attach"; static char Ebadoffset[] = "bad offset"; static char Ebadcount[] = "bad count"; /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:463,469 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:465,471 respond(r, Eunknownfid); return; } - if(r->ifcall.count < 0){ + if((int)r->ifcall.count < 0){ respond(r, Ebotch); return; } /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:509,515 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:511,517 respond(r, Eunknownfid); return; } - if(r->ifcall.count < 0){ + if((int)r->ifcall.count < 0){ respond(r, Ebotch); return; } /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:592,597 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:594,600 return; } if(r->fid->file){ + /* should we rlock the file? */ r->d = r->fid->file->Dir; if(r->d.name) r->d.name = estrdup9p(r->d.name); /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:630,636 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:633,639 } r->ofcall.nstat = convD2M(&r->d, statbuf, n); r->ofcall.stat = statbuf; /* freed in closereq */ - if(r->ofcall.nstat < 0){ + if(r->ofcall.nstat <= BIT16SZ){ r->error = "convD2M fails"; free(statbuf); return; /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/srv.c:813,818 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/srv.c:816,830 closereq(r); else free(r); + } + + void + responderror(Req *r) + { + char errbuf[ERRMAX]; + + rerrstr(errbuf, sizeof errbuf); + respond(r, errbuf); } int [rsc] --rw-rw-r-- M 84741 glenda sys 5747 Dec 11 07:50 sys/src/libc/9sys/fcallfmt.c /n/sourcesdump/2005/1211/plan9/sys/src/libc/9sys/fcallfmt.c:209,215 - /n/sourcesdump/2005/1212/plan9/sys/src/libc/9sys/fcallfmt.c:209,215 if(count > DUMPL) count = DUMPL; for(i=0; i127) + if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127) printable = 0; p = ans; *p++ = '\''; [rsc] --rw-rw-r-- M 84741 glenda sys 11914 Dec 11 10:48 sys/src/cmd/exportfs/exportsrv.c [rsc] --rw-rw-r-- M 84741 glenda sys 11914 Dec 11 10:48 sys/src/cmd/exportfs/exportsrv.c [rsc] --rw-rw-r-- M 84741 glenda sys 17110 Dec 11 16:07 sys/src/lib9p/srv.c [rsc] --rw-rw-r-- M 84741 rsc sys 1626 Dec 11 16:07 sys/src/lib9p/listen.c [rsc] --rw-rw-r-- M 84741 glenda sys 387 Dec 11 16:45 sys/src/lib9p/mkfile /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/mkfile:2,22 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/mkfile:2,24 LIB=/$objtype/lib/lib9p.a OFILES=\ - _post.$O\ + auth.$O\ dirread.$O\ fid.$O\ file.$O\ intmap.$O\ + listen.$O\ mem.$O\ req.$O\ parse.$O\ post.$O\ + rfork.$O\ srv.$O\ - tpost.$O\ + thread.$O\ uid.$O\ util.$O\ - HFILES=/sys/include/9p.h post.h + HFILES=/sys/include/9p.h UPDATE=\ mkfile\ [rsc] --rw-rw-r-- M 84741 glenda sys 1559 Dec 11 19:07 sys/src/lib9p/post.c /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/post.c:3,24 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/post.c:3,71 #include #include #include <9p.h> - #include "post.h" + #include + static void postproc(void*); + void - postmountsrv(Srv *s, char *name, char *mtpt, int flag) + _postmountsrv(Srv *s, char *name, char *mtpt, int flag) { - Postcrud *p; + int fd[2]; - p = _post1(s, name, mtpt, flag); - switch(rfork(RFPROC|RFNAMEG|RFMEM)){ - case -1: - sysfatal("rfork: %r"); - case 0: - _post2(s); - exits(nil); - default: - _post3(p); + if(!s->nopipe){ + if(pipe(fd) < 0) + sysfatal("pipe: %r"); + s->infd = s->outfd = fd[1]; + s->srvfd = fd[0]; } + if(name) + if(postfd(name, s->srvfd) < 0) + sysfatal("postfd %s: %r", name); + + if(_forker == nil) + sysfatal("no forker"); + _forker(postproc, s, RFNAMEG); + + /* + * Normally the server is posting as the last thing it does + * before exiting, so the correct thing to do is drop into + * a different fd space and close the 9P server half of the + * pipe before trying to mount the kernel half. This way, + * if the file server dies, we don't have a ref to the 9P server + * half of the pipe. Then killing the other procs will drop + * all the refs on the 9P server half, and the mount will fail. + * Otherwise the mount hangs forever. + * + * Libthread in general and acme win in particular make + * it hard to make this fd bookkeeping work out properly, + * so leaveinfdopen is a flag that win sets to opt out of this + * safety net. + */ + if(!s->leavefdsopen){ + rfork(RFFDG); + rendezvous(0, 0); + close(s->infd); + if(s->infd != s->outfd) + close(s->outfd); + } + + if(mtpt){ + if(amount(s->srvfd, mtpt, flag, "") == -1) + sysfatal("mount %s: %r", mtpt); + }else + close(s->srvfd); } + static void + postproc(void *v) + { + Srv *s; + + s = v; + if(!s->leavefdsopen){ + rfork(RFNOTEG); + rendezvous(0, 0); + close(s->srvfd); + } + srv(s); + } [rsc] --rw-rw-r-- M 84741 rsc sys 2657 Dec 11 16:07 sys/src/lib9p/ramfs.c /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/ramfs.c:129,134 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/ramfs.c:129,135 void main(int argc, char **argv) { + char *addr = nil; char *srvname = nil; char *mtpt = nil; Qid q; /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/ramfs.c:140,145 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/ramfs.c:141,149 case 'D': chatty9p++; break; + case 'a': + addr = EARGF(usage()); + break; case 's': srvname = EARGF(usage()); break; /n/sourcesdump/2005/1211/plan9/sys/src/lib9p/ramfs.c:155,163 - /n/sourcesdump/2005/1212/plan9/sys/src/lib9p/ramfs.c:159,170 if(chatty9p) fprint(2, "ramsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt); - if(srvname == nil && mtpt == nil) - sysfatal("you should at least specify a -s or -m option"); + if(addr == nil && srvname == nil && mtpt == nil) + sysfatal("must specify -a, -s, or -m option"); + if(addr) + listensrv(&fs, addr); - postmountsrv(&fs, srvname, mtpt, MREPL|MCREATE); + if(srvname || mtpt) + postmountsrv(&fs, srvname, mtpt, MREPL|MCREATE); exits(0); } [rsc] --rw-rw-r-- M 84741 rsc sys 493 Dec 11 16:07 sys/src/lib9p/rfork.c [rsc] --rw-rw-r-- M 84741 glenda sys 17110 Dec 11 16:07 sys/src/lib9p/srv.c [rsc] --rw-rw-r-- M 84741 rsc sys 407 Dec 11 16:07 sys/src/lib9p/thread.c [rsc] --rw-rw-r-- M 84741 rsc sys 3392 Dec 11 16:45 sys/src/lib9p/auth.c [rsc] --rw-rw-r-- M 84741 glenda sys 387 Dec 11 16:45 sys/src/lib9p/mkfile [rsc] --rw-rw-r-- M 84741 glenda sys 25287 Dec 11 19:08 sys/src/cmd/ql/obj.c [rsc] --rw-rw-r-- M 84741 glenda sys 1559 Dec 11 19:07 sys/src/lib9p/post.c