]> git.lizzy.rs Git - plan9front.git/commitdiff
pre-lib9p servers: fix incorrect Tversion handling
authorkvik <kvik@a-b.xyz>
Sat, 1 Aug 2020 13:27:28 +0000 (15:27 +0200)
committerkvik <kvik@a-b.xyz>
Sat, 1 Aug 2020 13:27:28 +0000 (15:27 +0200)
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.

22 files changed:
sys/src/cmd/9660srv/main.c
sys/src/cmd/acme/fsys.c
sys/src/cmd/auth/keyfs.c
sys/src/cmd/aux/9pcon.c
sys/src/cmd/aux/consolefs.c
sys/src/cmd/aux/depend.c
sys/src/cmd/aux/searchfs.c
sys/src/cmd/bzfs/oramfs.c
sys/src/cmd/dossrv/dosfs.c
sys/src/cmd/exportfs/exportsrv.c
sys/src/cmd/ip/ftpfs/ftpfs.c
sys/src/cmd/lnfs.c
sys/src/cmd/ndb/cs.c
sys/src/cmd/ndb/dns.c
sys/src/cmd/paqfs/paqfs.c
sys/src/cmd/plumb/fsys.c
sys/src/cmd/ratfs/proto.c
sys/src/cmd/rio/fsys.c
sys/src/cmd/tapefs/fs.c
sys/src/cmd/telco/telco.c
sys/src/cmd/upas/fs/fs.c
sys/src/cmd/vac/vacfs.c

index 5daea3a8be64bb87c21f537491dda7e23e49f378..ea034322b2aa85f699462ea71e8013ddac0fec23 100644 (file)
@@ -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
index 90135170258afd38fd3f7bb1b00cd73869e069af..4719542ab1d0e5a027e2a022d1b9537c099391b8 100644 (file)
@@ -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);
 }
 
index a0d421535a318640aa4792a4657baf59205fb0b4..920aca3a8f11d284a29d7c30fd5e144fe252c802 100644 (file)
@@ -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;
 }
 
index 9edf26510752b3a829425b324bce98ab3e947088..3c4b92ebeff7ce17c833e25884de17264f4875cb 100644 (file)
@@ -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");
 }
 
index feef1eef32df9611e2ee7d88b631748c19956618..1f469ead932546a4bb3ee00dcc74eb1a5fdcd1b0 100644 (file)
@@ -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);
 }
 
index 90da99addec67621c2a0cb627afbab42847fc12f..fa47b1be75056c7b25603b7c187656a4a9ffee68 100644 (file)
@@ -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);
 }
 
index be5ff92388550fffb2bd14da31213d8615ccbaa1..49a38ab867fbc51c5f6c81e726853738e6f68f9b 100644 (file)
@@ -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;
 }
 
index 27b5f84109286550f77b146fb52b0e2c85490026..5ef036fac7362d204a83051e11ff826dfaa42411 100644 (file)
@@ -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;
 }
 
index 4a644fca5baf537d91fc13409bfe1cfc1d90b5e7..72c94768e184fb76f787de89abbbdab358693b24 100644 (file)
@@ -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
index e5be530173285b8f055143648284f9e9da562cc1..a413ed0dc435918adbc6de402f9d87a19b45225d 100644 (file)
@@ -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);
 }
index abe8679824b1639f6b9a5d19f59c1b5fc193ff0a..8e4299b8a71b2a777f6ca4b58526483ee34d5597 100644 (file)
@@ -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;
 }
 
index e8bb1ce787cdd8e7f2e0bfb08faee00a3e4962ef..73ea09c797cad32bbf266bd38f7c69ad333ab62b 100644 (file)
@@ -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;
 }
 
index bb85080d49bcf39e358d898c16394e988e2aeccb..0396c57064835e1b7406dcaeb461cad23ad29574 100644 (file)
@@ -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
index 692246d04b7f2a97b11856b261c81abf5ffef988..2510f3619bcaf84b6199120a63046258f9ac4886 100644 (file)
@@ -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
index 029534a85def9e4e57f22606f514696f459854d8..34e05051ea71871408ca8b1315928fd7d2bf31a7 100644 (file)
@@ -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;
 }
 
index 92764d2486c4d37552f36092a6b5f042b9da131a..e79ea5c317d21fc692feae42196b810168793ba3 100644 (file)
@@ -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;
 }
index 8ca76ef40fdfd17225889929317fc6c6c7d6b35e..dc6bbc707b9250038580fbe075c6190e41a0f3df 100644 (file)
@@ -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);
 }
 
index fca5c046943102fddf34492828465ff004632bfa..1562f71e8c02ae1f1bc94c45a664eacf9ead601d 100644 (file)
@@ -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);
 }
 
index 95da4db1805b52c047f9020328440665f374f45b..98d5ea286c06ed4f647c2ec17893747db75a647b 100644 (file)
@@ -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)
index 4e20904e853515390bc48c499f93659e24078249..69f79d59b60abb0e5f7b9067e5d8c914fdeaeb70 100644 (file)
@@ -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;
 }
 
index 89e390e8d2bb773e545e31ca09765d1d100ee337..ae91803874a04c20372cf1c44c413ad40e2cd3c1 100644 (file)
@@ -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);
index cf3a2f2390c47fd5492cf7ff8e221405d34b7a24..54d16a7de4ea96338e0c7304d9e866838872a4ce 100644 (file)
@@ -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;
 }