From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from yow.a-b.xyz ([45.32.152.219]) by ewsd; Sun Jul 12 13:18:27 EDT 2020 Received: by yow.a-b.xyz (OpenSMTPD) with ESMTPSA id 55d5a554 (TLSv1.2:ECDHE-RSA-AES256-SHA:256:NO) for <9front@9front.org>; Sun, 12 Jul 2020 19:18:18 +0200 (CEST) Message-ID: To: 9front@9front.org Subject: [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers Date: Sun, 12 Jul 2020 19:18:15 +0200 From: kvik@a-b.xyz MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: stable framework service version(5) says: If the server does not understand the client's version string, it should respond with an Rversion message (not Rerror) with the version string the 7 characters ``unknown''. Pre-lib9p file servers -- all except cwfs(4) -- do return Rerror. lib9p(2) follows the above spec, although ignoring the next part concerning comparison after period-stripping. It assumes an Fcall.version starting with "9P" is correctly formed and returns the only supported version of the protocol. This seems alright. The following patch brings all the pre-lib9p servers in line with lib9p. diff -r 0cfcc2f8b898 sys/src/cmd/9660srv/main.c --- a/sys/src/cmd/9660srv/main.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/9660srv/main.c Sun Jul 12 19:12:24 2020 +0200 @@ -254,6 +254,8 @@ else rep->msize = req->msize; rep->version = "9P2000"; + if(strncmp(req->version, "9P", 2) != 0) + rep->version = "unknown"; } void diff -r 0cfcc2f8b898 sys/src/cmd/acme/fsys.c --- a/sys/src/cmd/acme/fsys.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/acme/fsys.c Sun Jul 12 19:12:24 2020 +0200 @@ -325,9 +325,9 @@ return respond(x, &t, "version: message size too small"); messagesize = x->msize; t.msize = messagesize; - if(strncmp(x->version, "9P2000", 6) != 0) - return respond(x, &t, "unrecognized 9P version"); t.version = "9P2000"; + if(strncmp(x->version, "9P", 2) != 0) + t.version = "unknown"; return respond(x, &t, nil); } diff -r 0cfcc2f8b898 sys/src/cmd/auth/keyfs.c --- a/sys/src/cmd/auth/keyfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/auth/keyfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -258,9 +258,9 @@ else thdr.msize = rhdr.msize; messagesize = thdr.msize; - if(strncmp(rhdr.version, "9P2000", 6) != 0) - return "bad 9P version"; thdr.version = "9P2000"; + if(strncmp(rhdr.version, "9P", 2) != 0) + thdr.version = "unknown"; return 0; } diff -r 0cfcc2f8b898 sys/src/cmd/aux/consolefs.c --- a/sys/src/cmd/aux/consolefs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/aux/consolefs.c Sun Jul 12 19:12:24 2020 +0200 @@ -763,12 +763,10 @@ if(messagesize > 8192+IOHDRSZ) messagesize = 8192+IOHDRSZ; r->f.msize = messagesize; - if(strncmp(r->f.version, "9P2000", 6) != 0){ - fsreply(fs, r, "unrecognized 9P version"); - return; - } - r->f.version = "9P2000"; - + if(strncmp(r->f.version, "9P", 2) != 0) + r->f.version = "unknown"; + else + r->f.version = "9P2000"; fsreply(fs, r, nil); } diff -r 0cfcc2f8b898 sys/src/cmd/aux/depend.c --- a/sys/src/cmd/aux/depend.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/aux/depend.c Sun Jul 12 19:12:24 2020 +0200 @@ -472,7 +472,10 @@ if(messagesize > r->f.msize) messagesize = r->f.msize; r->f.msize = messagesize; - r->f.version = "9P2000"; + if(strncmp(r->f.version, "9P", 2) != 0) + r->f.version = "unknown"; + else + r->f.version = "9P2000"; fsreply(fs, r, nil); } diff -r 0cfcc2f8b898 sys/src/cmd/aux/searchfs.c --- a/sys/src/cmd/aux/searchfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/aux/searchfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -687,9 +687,10 @@ if(rpc->msize > messagesize) rpc->msize = messagesize; messagesize = rpc->msize; - if(strncmp(rpc->version, "9P2000", 6) != 0) - return "unrecognized 9P version"; - rpc->version = "9P2000"; + if(strncmp(rpc->version, "9P", 2) != 0) + rpc->version = "unknown"; + else + rpc->version = "9P2000"; return nil; } diff -r 0cfcc2f8b898 sys/src/cmd/bzfs/oramfs.c --- a/sys/src/cmd/bzfs/oramfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/bzfs/oramfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -116,7 +116,6 @@ char Eisopen[] = "file already open for I/O"; char Excl[] = "exclusive use file already open"; char Ename[] = "illegal name"; -char Eversion[] = "unknown 9P version"; int debug; @@ -228,9 +227,9 @@ else rhdr.msize = thdr.msize; messagesize = rhdr.msize; - if(strncmp(thdr.version, "9P2000", 6) != 0) - return Eversion; rhdr.version = "9P2000"; + if(strncmp(thdr.version, "9P", 2) != 0) + rhdr.version = "unknown"; return 0; } diff -r 0cfcc2f8b898 sys/src/cmd/dossrv/dosfs.c --- a/sys/src/cmd/dossrv/dosfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/dossrv/dosfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -15,6 +15,8 @@ else rep->msize = req->msize; rep->version = "9P2000"; + if(strncmp(req->version, "9P", 2) != 0) + rep->version = "unknown"; } void diff -r 0cfcc2f8b898 sys/src/cmd/exportfs/exportsrv.c --- a/sys/src/cmd/exportfs/exportsrv.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/exportfs/exportsrv.c Sun Jul 12 19:12:24 2020 +0200 @@ -15,7 +15,6 @@ char Emip[] = "Mount in progress"; char Enopsmt[] = "Out of pseudo mount points"; char Enomem[] = "No memory"; -char Eversion[] = "Bad 9P2000 version"; char Ereadonly[] = "File system read only"; char Enoprocs[] = "Out of processes"; @@ -35,13 +34,10 @@ if(t->work.msize > messagesize) t->work.msize = messagesize; messagesize = t->work.msize; - if(strncmp(t->work.version, "9P2000", 6) != 0){ - reply(&t->work, &rhdr, Eversion); - putsbuf(t); - return; - } + rhdr.msize = t->work.msize; rhdr.version = "9P2000"; - rhdr.msize = t->work.msize; + if(strncmp(t->work.version, "9P", 2) != 0) + rhdr.version = "unknown"; reply(&t->work, &rhdr, 0); putsbuf(t); } diff -r 0cfcc2f8b898 sys/src/cmd/ip/ftpfs/ftpfs.c --- a/sys/src/cmd/ip/ftpfs/ftpfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/ip/ftpfs/ftpfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -314,9 +314,9 @@ rhdr.msize = thdr.msize; messagesize = rhdr.msize; - if(strncmp(thdr.version, "9P2000", 6) != 0) - return "unknown 9P version"; rhdr.version = "9P2000"; + if(strncmp(thdr.version, "9P", 2) != 0) + rhdr.version = "unknown"; return nil; } diff -r 0cfcc2f8b898 sys/src/cmd/lnfs.c --- a/sys/src/cmd/lnfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/lnfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -90,7 +90,6 @@ char Eisopen[] = "file already open for I/O"; char Excl[] = "exclusive use file already open"; char Ename[] = "illegal name"; -char Eversion[] = "unknown 9P version"; void usage(void) @@ -195,9 +194,9 @@ else rhdr.msize = thdr.msize; messagesize = rhdr.msize; - if(strncmp(thdr.version, "9P2000", 6) != 0) - return Eversion; rhdr.version = "9P2000"; + if(strncmp(thdr.version, "9P", 2) != 0) + rhdr.version = "unknown"; return nil; } diff -r 0cfcc2f8b898 sys/src/cmd/ndb/cs.c --- a/sys/src/cmd/ndb/cs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/ndb/cs.c Sun Jul 12 19:12:24 2020 +0200 @@ -510,12 +510,10 @@ job->reply.msize = IOHDRSZ + Maxfdata; else job->reply.msize = job->request.msize; - if(strncmp(job->request.version, "9P2000", 6) != 0) - sendmsg(job, "unknown 9P version"); - else{ - job->reply.version = "9P2000"; - sendmsg(job, nil); - } + job->reply.version = "9P2000"; + if(strncmp(job->request.version, "9P", 2) != 0) + job->reply.version = "unknown"; + sendmsg(job, nil); } void diff -r 0cfcc2f8b898 sys/src/cmd/ndb/dns.c --- a/sys/src/cmd/ndb/dns.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/ndb/dns.c Sun Jul 12 19:12:24 2020 +0200 @@ -485,12 +485,10 @@ job->reply.msize = IOHDRSZ + Maxfdata; else job->reply.msize = job->request.msize; - if(strncmp(job->request.version, "9P2000", 6) != 0) - sendmsg(job, "unknown 9P version"); - else{ - job->reply.version = "9P2000"; - sendmsg(job, 0); - } + job->reply.version = "9P2000"; + if(strncmp(job->request.version, "9P", 2) != 0) + job->reply.version = "unknown"; + sendmsg(job, nil); } void diff -r 0cfcc2f8b898 sys/src/cmd/paqfs/paqfs.c --- a/sys/src/cmd/paqfs/paqfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/paqfs/paqfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -135,7 +135,6 @@ char Ename[] = "illegal name"; char Erdonly[] = "read only file system"; char Ebadblock[] = "bad block"; -char Eversion[] = "bad version of P9"; char Edirtoobig[] = "directory entry too big"; int debug; @@ -270,9 +269,9 @@ thdr.msize = mesgsize; else thdr.msize = rhdr.msize; - if(strcmp(rhdr.version, "9P2000") != 0) - return Eversion; thdr.version = "9P2000"; + if(strncmp(rhdr.version, "9P", 2) != 0) + thdr.version = "unknown"; return 0; } diff -r 0cfcc2f8b898 sys/src/cmd/plumb/fsys.c --- a/sys/src/cmd/plumb/fsys.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/plumb/fsys.c Sun Jul 12 19:12:24 2020 +0200 @@ -563,11 +563,10 @@ if(t->msize < messagesize) messagesize = t->msize; t->msize = messagesize; - if(strncmp(t->version, "9P2000", 6) != 0){ - fsysrespond(t, buf, "unrecognized 9P version"); - return t; - } - t->version = "9P2000"; + if(strncmp(t->version, "9P", 2) != 0) + t->version = "unknown"; + else + t->version = "9P2000"; fsysrespond(t, buf, nil); return t; } diff -r 0cfcc2f8b898 sys/src/cmd/ratfs/proto.c --- a/sys/src/cmd/ratfs/proto.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/ratfs/proto.c Sun Jul 12 19:12:24 2020 +0200 @@ -131,9 +131,16 @@ static void rversion(Fcall *f) { - f->version = "9P2000"; + if(f->msize < 256){ + reply(f, "version: message size too small"); + return; + } if(f->msize > MAXRPC) f->msize = MAXRPC; + if(strncmp(f->version, "9P", 2) != 0) + f->version = "unknown"; + else + f->version = "9P2000"; reply(f, 0); } diff -r 0cfcc2f8b898 sys/src/cmd/rio/fsys.c --- a/sys/src/cmd/rio/fsys.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/rio/fsys.c Sun Jul 12 19:12:24 2020 +0200 @@ -294,9 +294,9 @@ return filsysrespond(x->fs, x, &t, "version: message size too small"); messagesize = x->msize; t.msize = messagesize; - if(strncmp(x->version, "9P2000", 6) != 0) - return filsysrespond(x->fs, x, &t, "unrecognized 9P version"); t.version = "9P2000"; + if(strncmp(x->version, "9P", 2) != 0) + t.version = "unknown"; return filsysrespond(fs, x, &t, nil); } diff -r 0cfcc2f8b898 sys/src/cmd/tapefs/fs.c --- a/sys/src/cmd/tapefs/fs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/tapefs/fs.c Sun Jul 12 19:12:24 2020 +0200 @@ -160,9 +160,9 @@ else messagesize = rhdr.msize; thdr.msize = messagesize; - if(strncmp(rhdr.version, "9P2000", 6) != 0) - return "unrecognized 9P version"; thdr.version = "9P2000"; + if(strncmp(rhdr.version, "9P", 2) != 0) + thdr.version = "unknown"; for(f = fids; f; f = f->next) if(f->busy) diff -r 0cfcc2f8b898 sys/src/cmd/telco/telco.c --- a/sys/src/cmd/telco/telco.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/telco/telco.c Sun Jul 12 19:12:24 2020 +0200 @@ -519,9 +519,9 @@ if(messagesize > sizeof mdata) messagesize = sizeof mdata; rhdr.msize = messagesize; - if(strncmp(thdr.version, "9P2000", 6) != 0) - return "unrecognized 9P version"; rhdr.version = "9P2000"; + if(strncmp(thdr.version, "9P", 2) != 0) + rhdr.version = "unknown"; return 0; } diff -r 0cfcc2f8b898 sys/src/cmd/upas/fs/fs.c --- a/sys/src/cmd/upas/fs/fs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/upas/fs/fs.c Sun Jul 12 19:12:24 2020 +0200 @@ -726,10 +726,10 @@ if(thdr.msize < messagesize) messagesize = thdr.msize; rhdr.msize = messagesize; - if(strncmp(thdr.version, "9P2000", 6) != 0) - return "unknown 9P version"; - else - rhdr.version = "9P2000"; + rhdr.version = "9P2000"; + if(strncmp(thdr.version, "9P", 2) != 0) + rhdr.version = "unknown"; + for(f = fids; f; f = f->next) if(f->busy) rclunk(f); diff -r 0cfcc2f8b898 sys/src/cmd/vac/vacfs.c --- a/sys/src/cmd/vac/vacfs.c Sat Jul 11 13:28:58 2020 -0700 +++ b/sys/src/cmd/vac/vacfs.c Sun Jul 12 19:12:24 2020 +0200 @@ -255,13 +255,13 @@ if(messagesize > sizeof mdata) messagesize = sizeof mdata; thdr.msize = messagesize; - if(strncmp(rhdr.version, "9P2000", 6) != 0) - return vtstrdup("unrecognized 9P version"); - thdr.version = "9P2000"; + if(strncmp(rhdr.version, "9P", 2) != 0) + thdr.version = "unknown"; if(strncmp(rhdr.version, "9P2000.u", 8) == 0){ dotu = 1; thdr.version = "9P2000.u"; - } + }else + thdr.version = "9P2000"; return nil; }