From e5894dcceaedeaf7d4f5537dd306170b1b6d4814 Mon Sep 17 00:00:00 2001 From: kvik Date: Sat, 1 Aug 2020 15:27:28 +0200 Subject: [PATCH] pre-lib9p servers: fix incorrect Tversion handling 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, which seems alright. This patch brings pre-lib9p servers in accordance with the spec. --- sys/src/cmd/9660srv/main.c | 2 ++ sys/src/cmd/acme/fsys.c | 4 ++-- sys/src/cmd/auth/keyfs.c | 4 ++-- sys/src/cmd/aux/9pcon.c | 2 +- sys/src/cmd/aux/consolefs.c | 10 ++++------ sys/src/cmd/aux/depend.c | 5 ++++- sys/src/cmd/aux/searchfs.c | 7 ++++--- sys/src/cmd/bzfs/oramfs.c | 5 ++--- sys/src/cmd/dossrv/dosfs.c | 2 ++ sys/src/cmd/exportfs/exportsrv.c | 10 +++------- sys/src/cmd/ip/ftpfs/ftpfs.c | 4 ++-- sys/src/cmd/lnfs.c | 5 ++--- sys/src/cmd/ndb/cs.c | 10 ++++------ sys/src/cmd/ndb/dns.c | 10 ++++------ sys/src/cmd/paqfs/paqfs.c | 5 ++--- sys/src/cmd/plumb/fsys.c | 9 ++++----- sys/src/cmd/ratfs/proto.c | 9 ++++++++- sys/src/cmd/rio/fsys.c | 4 ++-- sys/src/cmd/tapefs/fs.c | 4 ++-- sys/src/cmd/telco/telco.c | 4 ++-- sys/src/cmd/upas/fs/fs.c | 8 ++++---- sys/src/cmd/vac/vacfs.c | 8 ++++---- 22 files changed, 66 insertions(+), 65 deletions(-) diff --git a/sys/src/cmd/9660srv/main.c b/sys/src/cmd/9660srv/main.c index 5daea3a8b..ea034322b 100644 --- a/sys/src/cmd/9660srv/main.c +++ b/sys/src/cmd/9660srv/main.c @@ -254,6 +254,8 @@ rversion(void) else rep->msize = req->msize; rep->version = "9P2000"; + if(strncmp(req->version, "9P", 2) != 0) + rep->version = "unknown"; } void diff --git a/sys/src/cmd/acme/fsys.c b/sys/src/cmd/acme/fsys.c index 901351702..4719542ab 100644 --- a/sys/src/cmd/acme/fsys.c +++ b/sys/src/cmd/acme/fsys.c @@ -325,9 +325,9 @@ fsysversion(Xfid *x, Fid*) 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 --git a/sys/src/cmd/auth/keyfs.c b/sys/src/cmd/auth/keyfs.c index a0d421535..920aca3a8 100644 --- a/sys/src/cmd/auth/keyfs.c +++ b/sys/src/cmd/auth/keyfs.c @@ -258,9 +258,9 @@ Version(Fid*) 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 --git a/sys/src/cmd/aux/9pcon.c b/sys/src/cmd/aux/9pcon.c index 9edf26510..3c4b92ebe 100644 --- a/sys/src/cmd/aux/9pcon.c +++ b/sys/src/cmd/aux/9pcon.c @@ -57,7 +57,7 @@ watch(int fd) } if(n == 0) print("server eof\n"); - else + else if(n == -1) print("read9pmsg from server: %r\n"); } diff --git a/sys/src/cmd/aux/consolefs.c b/sys/src/cmd/aux/consolefs.c index feef1eef3..1f469ead9 100644 --- a/sys/src/cmd/aux/consolefs.c +++ b/sys/src/cmd/aux/consolefs.c @@ -763,12 +763,10 @@ fsversion(Fs *fs, Request *r, Fid*) 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 --git a/sys/src/cmd/aux/depend.c b/sys/src/cmd/aux/depend.c index 90da99add..fa47b1be7 100644 --- a/sys/src/cmd/aux/depend.c +++ b/sys/src/cmd/aux/depend.c @@ -472,7 +472,10 @@ fsversion(Fs *fs, Request *r, Fid*) 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 --git a/sys/src/cmd/aux/searchfs.c b/sys/src/cmd/aux/searchfs.c index be5ff9238..49a38ab86 100644 --- a/sys/src/cmd/aux/searchfs.c +++ b/sys/src/cmd/aux/searchfs.c @@ -687,9 +687,10 @@ fsversion(Fs *, Fcall *rpc) 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 --git a/sys/src/cmd/bzfs/oramfs.c b/sys/src/cmd/bzfs/oramfs.c index 27b5f8410..5ef036fac 100644 --- a/sys/src/cmd/bzfs/oramfs.c +++ b/sys/src/cmd/bzfs/oramfs.c @@ -116,7 +116,6 @@ char Enotowner[] = "not owner"; 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 @@ rversion(Fid*) 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 --git a/sys/src/cmd/dossrv/dosfs.c b/sys/src/cmd/dossrv/dosfs.c index 4a644fca5..72c94768e 100644 --- a/sys/src/cmd/dossrv/dosfs.c +++ b/sys/src/cmd/dossrv/dosfs.c @@ -15,6 +15,8 @@ rversion(void) else rep->msize = req->msize; rep->version = "9P2000"; + if(strncmp(req->version, "9P", 2) != 0) + rep->version = "unknown"; } void diff --git a/sys/src/cmd/exportfs/exportsrv.c b/sys/src/cmd/exportfs/exportsrv.c index e5be53017..a413ed0dc 100644 --- a/sys/src/cmd/exportfs/exportsrv.c +++ b/sys/src/cmd/exportfs/exportsrv.c @@ -15,7 +15,6 @@ char Exmnt[] = "Cannot .. past mount point"; 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 @@ Xversion(Fsrpc *t) 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.version = "9P2000"; rhdr.msize = t->work.msize; + rhdr.version = "9P2000"; + if(strncmp(t->work.version, "9P", 2) != 0) + rhdr.version = "unknown"; reply(&t->work, &rhdr, 0); putsbuf(t); } diff --git a/sys/src/cmd/ip/ftpfs/ftpfs.c b/sys/src/cmd/ip/ftpfs/ftpfs.c index abe867982..8e4299b8a 100644 --- a/sys/src/cmd/ip/ftpfs/ftpfs.c +++ b/sys/src/cmd/ip/ftpfs/ftpfs.c @@ -314,9 +314,9 @@ rversion(Fid*) 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 --git a/sys/src/cmd/lnfs.c b/sys/src/cmd/lnfs.c index e8bb1ce78..73ea09c79 100644 --- a/sys/src/cmd/lnfs.c +++ b/sys/src/cmd/lnfs.c @@ -90,7 +90,6 @@ char Enotowner[] = "not owner"; 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 @@ rversion(Fid*) 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 --git a/sys/src/cmd/ndb/cs.c b/sys/src/cmd/ndb/cs.c index bb85080d4..0396c5706 100644 --- a/sys/src/cmd/ndb/cs.c +++ b/sys/src/cmd/ndb/cs.c @@ -510,12 +510,10 @@ rversion(Job *job) 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 --git a/sys/src/cmd/ndb/dns.c b/sys/src/cmd/ndb/dns.c index 692246d04..2510f3619 100644 --- a/sys/src/cmd/ndb/dns.c +++ b/sys/src/cmd/ndb/dns.c @@ -485,12 +485,10 @@ rversion(Job *job) 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 --git a/sys/src/cmd/paqfs/paqfs.c b/sys/src/cmd/paqfs/paqfs.c index 029534a85..34e05051e 100644 --- a/sys/src/cmd/paqfs/paqfs.c +++ b/sys/src/cmd/paqfs/paqfs.c @@ -135,7 +135,6 @@ char Excl[] = "exclusive use file already open"; 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 @@ rversion(Fid*) 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 --git a/sys/src/cmd/plumb/fsys.c b/sys/src/cmd/plumb/fsys.c index 92764d248..e79ea5c31 100644 --- a/sys/src/cmd/plumb/fsys.c +++ b/sys/src/cmd/plumb/fsys.c @@ -563,11 +563,10 @@ fsysversion(Fcall *t, uchar *buf, Fid*) 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 --git a/sys/src/cmd/ratfs/proto.c b/sys/src/cmd/ratfs/proto.c index 8ca76ef40..dc6bbc707 100644 --- a/sys/src/cmd/ratfs/proto.c +++ b/sys/src/cmd/ratfs/proto.c @@ -131,9 +131,16 @@ newfid(int fid) 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 --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index fca5c0469..1562f71e8 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -294,9 +294,9 @@ filsysversion(Filsys *fs, Xfid *x, Fid*) 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 --git a/sys/src/cmd/tapefs/fs.c b/sys/src/cmd/tapefs/fs.c index 95da4db18..98d5ea286 100644 --- a/sys/src/cmd/tapefs/fs.c +++ b/sys/src/cmd/tapefs/fs.c @@ -160,9 +160,9 @@ rversion(Fid *unused) 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 --git a/sys/src/cmd/telco/telco.c b/sys/src/cmd/telco/telco.c index 4e20904e8..69f79d59b 100644 --- a/sys/src/cmd/telco/telco.c +++ b/sys/src/cmd/telco/telco.c @@ -519,9 +519,9 @@ rversion(Fid *) 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 --git a/sys/src/cmd/upas/fs/fs.c b/sys/src/cmd/upas/fs/fs.c index 89e390e8d..ae9180387 100644 --- a/sys/src/cmd/upas/fs/fs.c +++ b/sys/src/cmd/upas/fs/fs.c @@ -726,10 +726,10 @@ rversion(Fid*) 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 --git a/sys/src/cmd/vac/vacfs.c b/sys/src/cmd/vac/vacfs.c index cf3a2f239..54d16a7de 100644 --- a/sys/src/cmd/vac/vacfs.c +++ b/sys/src/cmd/vac/vacfs.c @@ -255,13 +255,13 @@ rversion(Fid *unused) 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; }