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.front
parent
88a468f205
commit
e5894dccea
|
@ -254,6 +254,8 @@ rversion(void)
|
||||||
else
|
else
|
||||||
rep->msize = req->msize;
|
rep->msize = req->msize;
|
||||||
rep->version = "9P2000";
|
rep->version = "9P2000";
|
||||||
|
if(strncmp(req->version, "9P", 2) != 0)
|
||||||
|
rep->version = "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -325,9 +325,9 @@ fsysversion(Xfid *x, Fid*)
|
||||||
return respond(x, &t, "version: message size too small");
|
return respond(x, &t, "version: message size too small");
|
||||||
messagesize = x->msize;
|
messagesize = x->msize;
|
||||||
t.msize = messagesize;
|
t.msize = messagesize;
|
||||||
if(strncmp(x->version, "9P2000", 6) != 0)
|
|
||||||
return respond(x, &t, "unrecognized 9P version");
|
|
||||||
t.version = "9P2000";
|
t.version = "9P2000";
|
||||||
|
if(strncmp(x->version, "9P", 2) != 0)
|
||||||
|
t.version = "unknown";
|
||||||
return respond(x, &t, nil);
|
return respond(x, &t, nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -258,9 +258,9 @@ Version(Fid*)
|
||||||
else
|
else
|
||||||
thdr.msize = rhdr.msize;
|
thdr.msize = rhdr.msize;
|
||||||
messagesize = thdr.msize;
|
messagesize = thdr.msize;
|
||||||
if(strncmp(rhdr.version, "9P2000", 6) != 0)
|
|
||||||
return "bad 9P version";
|
|
||||||
thdr.version = "9P2000";
|
thdr.version = "9P2000";
|
||||||
|
if(strncmp(rhdr.version, "9P", 2) != 0)
|
||||||
|
thdr.version = "unknown";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ watch(int fd)
|
||||||
}
|
}
|
||||||
if(n == 0)
|
if(n == 0)
|
||||||
print("server eof\n");
|
print("server eof\n");
|
||||||
else
|
else if(n == -1)
|
||||||
print("read9pmsg from server: %r\n");
|
print("read9pmsg from server: %r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -763,12 +763,10 @@ fsversion(Fs *fs, Request *r, Fid*)
|
||||||
if(messagesize > 8192+IOHDRSZ)
|
if(messagesize > 8192+IOHDRSZ)
|
||||||
messagesize = 8192+IOHDRSZ;
|
messagesize = 8192+IOHDRSZ;
|
||||||
r->f.msize = messagesize;
|
r->f.msize = messagesize;
|
||||||
if(strncmp(r->f.version, "9P2000", 6) != 0){
|
if(strncmp(r->f.version, "9P", 2) != 0)
|
||||||
fsreply(fs, r, "unrecognized 9P version");
|
r->f.version = "unknown";
|
||||||
return;
|
else
|
||||||
}
|
r->f.version = "9P2000";
|
||||||
r->f.version = "9P2000";
|
|
||||||
|
|
||||||
fsreply(fs, r, nil);
|
fsreply(fs, r, nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -472,7 +472,10 @@ fsversion(Fs *fs, Request *r, Fid*)
|
||||||
if(messagesize > r->f.msize)
|
if(messagesize > r->f.msize)
|
||||||
messagesize = r->f.msize;
|
messagesize = r->f.msize;
|
||||||
r->f.msize = messagesize;
|
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);
|
fsreply(fs, r, nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -687,9 +687,10 @@ fsversion(Fs *, Fcall *rpc)
|
||||||
if(rpc->msize > messagesize)
|
if(rpc->msize > messagesize)
|
||||||
rpc->msize = messagesize;
|
rpc->msize = messagesize;
|
||||||
messagesize = rpc->msize;
|
messagesize = rpc->msize;
|
||||||
if(strncmp(rpc->version, "9P2000", 6) != 0)
|
if(strncmp(rpc->version, "9P", 2) != 0)
|
||||||
return "unrecognized 9P version";
|
rpc->version = "unknown";
|
||||||
rpc->version = "9P2000";
|
else
|
||||||
|
rpc->version = "9P2000";
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,6 @@ char Enotowner[] = "not owner";
|
||||||
char Eisopen[] = "file already open for I/O";
|
char Eisopen[] = "file already open for I/O";
|
||||||
char Excl[] = "exclusive use file already open";
|
char Excl[] = "exclusive use file already open";
|
||||||
char Ename[] = "illegal name";
|
char Ename[] = "illegal name";
|
||||||
char Eversion[] = "unknown 9P version";
|
|
||||||
|
|
||||||
int debug;
|
int debug;
|
||||||
|
|
||||||
|
@ -228,9 +227,9 @@ rversion(Fid*)
|
||||||
else
|
else
|
||||||
rhdr.msize = thdr.msize;
|
rhdr.msize = thdr.msize;
|
||||||
messagesize = rhdr.msize;
|
messagesize = rhdr.msize;
|
||||||
if(strncmp(thdr.version, "9P2000", 6) != 0)
|
|
||||||
return Eversion;
|
|
||||||
rhdr.version = "9P2000";
|
rhdr.version = "9P2000";
|
||||||
|
if(strncmp(thdr.version, "9P", 2) != 0)
|
||||||
|
rhdr.version = "unknown";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ rversion(void)
|
||||||
else
|
else
|
||||||
rep->msize = req->msize;
|
rep->msize = req->msize;
|
||||||
rep->version = "9P2000";
|
rep->version = "9P2000";
|
||||||
|
if(strncmp(req->version, "9P", 2) != 0)
|
||||||
|
rep->version = "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -15,7 +15,6 @@ char Exmnt[] = "Cannot .. past mount point";
|
||||||
char Emip[] = "Mount in progress";
|
char Emip[] = "Mount in progress";
|
||||||
char Enopsmt[] = "Out of pseudo mount points";
|
char Enopsmt[] = "Out of pseudo mount points";
|
||||||
char Enomem[] = "No memory";
|
char Enomem[] = "No memory";
|
||||||
char Eversion[] = "Bad 9P2000 version";
|
|
||||||
char Ereadonly[] = "File system read only";
|
char Ereadonly[] = "File system read only";
|
||||||
char Enoprocs[] = "Out of processes";
|
char Enoprocs[] = "Out of processes";
|
||||||
|
|
||||||
|
@ -35,13 +34,10 @@ Xversion(Fsrpc *t)
|
||||||
if(t->work.msize > messagesize)
|
if(t->work.msize > messagesize)
|
||||||
t->work.msize = messagesize;
|
t->work.msize = messagesize;
|
||||||
messagesize = t->work.msize;
|
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.msize = t->work.msize;
|
||||||
|
rhdr.version = "9P2000";
|
||||||
|
if(strncmp(t->work.version, "9P", 2) != 0)
|
||||||
|
rhdr.version = "unknown";
|
||||||
reply(&t->work, &rhdr, 0);
|
reply(&t->work, &rhdr, 0);
|
||||||
putsbuf(t);
|
putsbuf(t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -314,9 +314,9 @@ rversion(Fid*)
|
||||||
rhdr.msize = thdr.msize;
|
rhdr.msize = thdr.msize;
|
||||||
messagesize = rhdr.msize;
|
messagesize = rhdr.msize;
|
||||||
|
|
||||||
if(strncmp(thdr.version, "9P2000", 6) != 0)
|
|
||||||
return "unknown 9P version";
|
|
||||||
rhdr.version = "9P2000";
|
rhdr.version = "9P2000";
|
||||||
|
if(strncmp(thdr.version, "9P", 2) != 0)
|
||||||
|
rhdr.version = "unknown";
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,6 @@ char Enotowner[] = "not owner";
|
||||||
char Eisopen[] = "file already open for I/O";
|
char Eisopen[] = "file already open for I/O";
|
||||||
char Excl[] = "exclusive use file already open";
|
char Excl[] = "exclusive use file already open";
|
||||||
char Ename[] = "illegal name";
|
char Ename[] = "illegal name";
|
||||||
char Eversion[] = "unknown 9P version";
|
|
||||||
|
|
||||||
void
|
void
|
||||||
usage(void)
|
usage(void)
|
||||||
|
@ -195,9 +194,9 @@ rversion(Fid*)
|
||||||
else
|
else
|
||||||
rhdr.msize = thdr.msize;
|
rhdr.msize = thdr.msize;
|
||||||
messagesize = rhdr.msize;
|
messagesize = rhdr.msize;
|
||||||
if(strncmp(thdr.version, "9P2000", 6) != 0)
|
|
||||||
return Eversion;
|
|
||||||
rhdr.version = "9P2000";
|
rhdr.version = "9P2000";
|
||||||
|
if(strncmp(thdr.version, "9P", 2) != 0)
|
||||||
|
rhdr.version = "unknown";
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -510,12 +510,10 @@ rversion(Job *job)
|
||||||
job->reply.msize = IOHDRSZ + Maxfdata;
|
job->reply.msize = IOHDRSZ + Maxfdata;
|
||||||
else
|
else
|
||||||
job->reply.msize = job->request.msize;
|
job->reply.msize = job->request.msize;
|
||||||
if(strncmp(job->request.version, "9P2000", 6) != 0)
|
job->reply.version = "9P2000";
|
||||||
sendmsg(job, "unknown 9P version");
|
if(strncmp(job->request.version, "9P", 2) != 0)
|
||||||
else{
|
job->reply.version = "unknown";
|
||||||
job->reply.version = "9P2000";
|
sendmsg(job, nil);
|
||||||
sendmsg(job, nil);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -485,12 +485,10 @@ rversion(Job *job)
|
||||||
job->reply.msize = IOHDRSZ + Maxfdata;
|
job->reply.msize = IOHDRSZ + Maxfdata;
|
||||||
else
|
else
|
||||||
job->reply.msize = job->request.msize;
|
job->reply.msize = job->request.msize;
|
||||||
if(strncmp(job->request.version, "9P2000", 6) != 0)
|
job->reply.version = "9P2000";
|
||||||
sendmsg(job, "unknown 9P version");
|
if(strncmp(job->request.version, "9P", 2) != 0)
|
||||||
else{
|
job->reply.version = "unknown";
|
||||||
job->reply.version = "9P2000";
|
sendmsg(job, nil);
|
||||||
sendmsg(job, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -135,7 +135,6 @@ char Excl[] = "exclusive use file already open";
|
||||||
char Ename[] = "illegal name";
|
char Ename[] = "illegal name";
|
||||||
char Erdonly[] = "read only file system";
|
char Erdonly[] = "read only file system";
|
||||||
char Ebadblock[] = "bad block";
|
char Ebadblock[] = "bad block";
|
||||||
char Eversion[] = "bad version of P9";
|
|
||||||
char Edirtoobig[] = "directory entry too big";
|
char Edirtoobig[] = "directory entry too big";
|
||||||
|
|
||||||
int debug;
|
int debug;
|
||||||
|
@ -270,9 +269,9 @@ rversion(Fid*)
|
||||||
thdr.msize = mesgsize;
|
thdr.msize = mesgsize;
|
||||||
else
|
else
|
||||||
thdr.msize = rhdr.msize;
|
thdr.msize = rhdr.msize;
|
||||||
if(strcmp(rhdr.version, "9P2000") != 0)
|
|
||||||
return Eversion;
|
|
||||||
thdr.version = "9P2000";
|
thdr.version = "9P2000";
|
||||||
|
if(strncmp(rhdr.version, "9P", 2) != 0)
|
||||||
|
thdr.version = "unknown";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -563,11 +563,10 @@ fsysversion(Fcall *t, uchar *buf, Fid*)
|
||||||
if(t->msize < messagesize)
|
if(t->msize < messagesize)
|
||||||
messagesize = t->msize;
|
messagesize = t->msize;
|
||||||
t->msize = messagesize;
|
t->msize = messagesize;
|
||||||
if(strncmp(t->version, "9P2000", 6) != 0){
|
if(strncmp(t->version, "9P", 2) != 0)
|
||||||
fsysrespond(t, buf, "unrecognized 9P version");
|
t->version = "unknown";
|
||||||
return t;
|
else
|
||||||
}
|
t->version = "9P2000";
|
||||||
t->version = "9P2000";
|
|
||||||
fsysrespond(t, buf, nil);
|
fsysrespond(t, buf, nil);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,9 +131,16 @@ newfid(int fid)
|
||||||
static void
|
static void
|
||||||
rversion(Fcall *f)
|
rversion(Fcall *f)
|
||||||
{
|
{
|
||||||
f->version = "9P2000";
|
if(f->msize < 256){
|
||||||
|
reply(f, "version: message size too small");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(f->msize > MAXRPC)
|
if(f->msize > MAXRPC)
|
||||||
f->msize = MAXRPC;
|
f->msize = MAXRPC;
|
||||||
|
if(strncmp(f->version, "9P", 2) != 0)
|
||||||
|
f->version = "unknown";
|
||||||
|
else
|
||||||
|
f->version = "9P2000";
|
||||||
reply(f, 0);
|
reply(f, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -294,9 +294,9 @@ filsysversion(Filsys *fs, Xfid *x, Fid*)
|
||||||
return filsysrespond(x->fs, x, &t, "version: message size too small");
|
return filsysrespond(x->fs, x, &t, "version: message size too small");
|
||||||
messagesize = x->msize;
|
messagesize = x->msize;
|
||||||
t.msize = messagesize;
|
t.msize = messagesize;
|
||||||
if(strncmp(x->version, "9P2000", 6) != 0)
|
|
||||||
return filsysrespond(x->fs, x, &t, "unrecognized 9P version");
|
|
||||||
t.version = "9P2000";
|
t.version = "9P2000";
|
||||||
|
if(strncmp(x->version, "9P", 2) != 0)
|
||||||
|
t.version = "unknown";
|
||||||
return filsysrespond(fs, x, &t, nil);
|
return filsysrespond(fs, x, &t, nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,9 +160,9 @@ rversion(Fid *unused)
|
||||||
else
|
else
|
||||||
messagesize = rhdr.msize;
|
messagesize = rhdr.msize;
|
||||||
thdr.msize = messagesize;
|
thdr.msize = messagesize;
|
||||||
if(strncmp(rhdr.version, "9P2000", 6) != 0)
|
|
||||||
return "unrecognized 9P version";
|
|
||||||
thdr.version = "9P2000";
|
thdr.version = "9P2000";
|
||||||
|
if(strncmp(rhdr.version, "9P", 2) != 0)
|
||||||
|
thdr.version = "unknown";
|
||||||
|
|
||||||
for(f = fids; f; f = f->next)
|
for(f = fids; f; f = f->next)
|
||||||
if(f->busy)
|
if(f->busy)
|
||||||
|
|
|
@ -519,9 +519,9 @@ rversion(Fid *)
|
||||||
if(messagesize > sizeof mdata)
|
if(messagesize > sizeof mdata)
|
||||||
messagesize = sizeof mdata;
|
messagesize = sizeof mdata;
|
||||||
rhdr.msize = messagesize;
|
rhdr.msize = messagesize;
|
||||||
if(strncmp(thdr.version, "9P2000", 6) != 0)
|
|
||||||
return "unrecognized 9P version";
|
|
||||||
rhdr.version = "9P2000";
|
rhdr.version = "9P2000";
|
||||||
|
if(strncmp(thdr.version, "9P", 2) != 0)
|
||||||
|
rhdr.version = "unknown";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -726,10 +726,10 @@ rversion(Fid*)
|
||||||
if(thdr.msize < messagesize)
|
if(thdr.msize < messagesize)
|
||||||
messagesize = thdr.msize;
|
messagesize = thdr.msize;
|
||||||
rhdr.msize = messagesize;
|
rhdr.msize = messagesize;
|
||||||
if(strncmp(thdr.version, "9P2000", 6) != 0)
|
rhdr.version = "9P2000";
|
||||||
return "unknown 9P version";
|
if(strncmp(thdr.version, "9P", 2) != 0)
|
||||||
else
|
rhdr.version = "unknown";
|
||||||
rhdr.version = "9P2000";
|
|
||||||
for(f = fids; f; f = f->next)
|
for(f = fids; f; f = f->next)
|
||||||
if(f->busy)
|
if(f->busy)
|
||||||
rclunk(f);
|
rclunk(f);
|
||||||
|
|
|
@ -255,13 +255,13 @@ rversion(Fid *unused)
|
||||||
if(messagesize > sizeof mdata)
|
if(messagesize > sizeof mdata)
|
||||||
messagesize = sizeof mdata;
|
messagesize = sizeof mdata;
|
||||||
thdr.msize = messagesize;
|
thdr.msize = messagesize;
|
||||||
if(strncmp(rhdr.version, "9P2000", 6) != 0)
|
if(strncmp(rhdr.version, "9P", 2) != 0)
|
||||||
return vtstrdup("unrecognized 9P version");
|
thdr.version = "unknown";
|
||||||
thdr.version = "9P2000";
|
|
||||||
if(strncmp(rhdr.version, "9P2000.u", 8) == 0){
|
if(strncmp(rhdr.version, "9P2000.u", 8) == 0){
|
||||||
dotu = 1;
|
dotu = 1;
|
||||||
thdr.version = "9P2000.u";
|
thdr.version = "9P2000.u";
|
||||||
}
|
}else
|
||||||
|
thdr.version = "9P2000";
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue