9front - general discussion about 9front
 help / color / mirror / Atom feed
* [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers
@ 2020-07-12 17:18 kvik
  2020-07-12 19:33 ` [9front] " ori
  0 siblings, 1 reply; 3+ messages in thread
From: kvik @ 2020-07-12 17:18 UTC (permalink / raw)
  To: 9front

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;
 }
 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9front] [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers
  2020-07-12 17:18 [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers kvik
@ 2020-07-12 19:33 ` ori
  2020-07-12 20:46   ` kvik
  0 siblings, 1 reply; 3+ messages in thread
From: ori @ 2020-07-12 19:33 UTC (permalink / raw)
  To: kvik, 9front

> 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.

Code looks good to me. How have you tested the mismatched versions?



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9front] [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers
  2020-07-12 19:33 ` [9front] " ori
@ 2020-07-12 20:46   ` kvik
  0 siblings, 0 replies; 3+ messages in thread
From: kvik @ 2020-07-12 20:46 UTC (permalink / raw)
  To: 9front

> How have you tested the mismatched versions?

Where possible, by something like:

	; aux/9pcon -c 'exportfs -r /'
	Tversion 256 9P2000
	-> Tversion tag 65535 msize 256 version '9P2000'
	<- Rversion tag 65535 msize 256 version '9P2000'
	Tversion 256 9P2020
	-> Tversion tag 65535 msize 256 version '9P2020'
	<- Rversion tag 65535 msize 256 version '9P2000'
	Tversion 256 8½P2000
	-> Tversion tag 65535 msize 256 version '8½P2000'
	<- Rversion tag 65535 msize 256 version 'unknown'

I will admit to not having tested every file server.  Some of
which like aux/searchfs I have no idea how to run, and some of
which aren't amenable to be run under 9pcon due to not posting
to /srv nor talking 9p on stdio.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-07-12 20:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-12 17:18 [PATCH] Fix incorrect Tversion handling by pre-lib9p file servers kvik
2020-07-12 19:33 ` [9front] " ori
2020-07-12 20:46   ` kvik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).