diff -r 116e06273815 sys/src/lib9p/srv.c --- a/sys/src/lib9p/srv.c Sun Apr 26 19:55:53 2020 +0200 +++ b/sys/src/lib9p/srv.c Mon Apr 27 05:31:08 2020 +0200 @@ -214,8 +214,14 @@ static void rauth(Req *r, char *error) { - if(error && r->afid) + if(r->afid == nil) + return; + if(error){ closefid(removefid(r->srv->fpool, r->afid->fid)); + return; + } + if(r->afid->omode == -1) + r->afid->omode = ORDWR; } static void @@ -493,6 +499,15 @@ respond(r, Eunknownfid); return; } + if(r->fid->omode == -1){ + respond(r, Ebotch); + return; + } + o = r->fid->omode & 3; + if(o != OREAD && o != ORDWR && o != OEXEC){ + respond(r, Ebotch); + return; + } if((int)r->ifcall.count < 0){ respond(r, Ebotch); return; @@ -502,16 +517,10 @@ respond(r, Ebadoffset); return; } - if(r->ifcall.count > srv->msize - IOHDRSZ) r->ifcall.count = srv->msize - IOHDRSZ; r->rbuf = emalloc9p(r->ifcall.count); r->ofcall.data = r->rbuf; - o = r->fid->omode & 3; - if(o != OREAD && o != ORDWR && o != OEXEC){ - respond(r, Ebotch); - return; - } if((r->fid->qid.type&QTDIR) && r->fid->file){ r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count, r->ifcall.offset); respond(r, nil); @@ -539,6 +548,16 @@ respond(r, Eunknownfid); return; } + if(r->fid->omode == -1){ + respond(r, Ebotch); + return; + } + o = r->fid->omode & 3; + if(o != OWRITE && o != ORDWR){ + snprint(e, sizeof e, "write on fid with open mode 0x%ux", r->fid->omode); + respond(r, e); + return; + } if((int)r->ifcall.count < 0){ respond(r, Ebotch); return; @@ -549,12 +568,6 @@ } if(r->ifcall.count > srv->msize - IOHDRSZ) r->ifcall.count = srv->msize - IOHDRSZ; - o = r->fid->omode & 3; - if(o != OWRITE && o != ORDWR){ - snprint(e, sizeof e, "write on fid with open mode 0x%ux", r->fid->omode); - respond(r, e); - return; - } if(srv->write) srv->write(r); else