summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-01-30 06:28:42 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-01-30 06:28:42 +0100
commit3787f721c1efe19c0502dc7e429459804100757d (patch)
tree2f13a3f87496668b131eff4025d62b8dfdf4ac2e
parentdbbbff89151794c838319e831254bcff6b3dbbcf (diff)
downloadplan9front-3787f721c1efe19c0502dc7e429459804100757d.tar.xz
9p message size too small
various fileservers do not check if the message size is too small (they subtract IOHDRSZ later from it to calculate iounit) which can overflow.
-rw-r--r--sys/src/cmd/auth/keyfs.c2
-rw-r--r--sys/src/cmd/bzfs/oramfs.c2
-rw-r--r--sys/src/cmd/cwfs/9p2.c2
-rw-r--r--sys/src/cmd/disk/kfs/9p2.c3
-rw-r--r--sys/src/cmd/exportfs/exportsrv.c6
-rw-r--r--sys/src/cmd/ip/ftpfs/ftpfs.c8
-rw-r--r--sys/src/cmd/unix/u9fs/u9fs.c4
-rw-r--r--sys/src/cmd/vnc/exportfs.c2
8 files changed, 25 insertions, 4 deletions
diff --git a/sys/src/cmd/auth/keyfs.c b/sys/src/cmd/auth/keyfs.c
index 61df8d61b..193acf27e 100644
--- a/sys/src/cmd/auth/keyfs.c
+++ b/sys/src/cmd/auth/keyfs.c
@@ -224,6 +224,8 @@ Version(Fid*)
for(f = fids; f; f = f->next)
if(f->busy)
Clunk(f);
+ if(rhdr.msize < 256)
+ return "message size too small";
if(rhdr.msize > sizeof mdata)
thdr.msize = sizeof mdata;
else
diff --git a/sys/src/cmd/bzfs/oramfs.c b/sys/src/cmd/bzfs/oramfs.c
index cba02724a..7f5d686d8 100644
--- a/sys/src/cmd/bzfs/oramfs.c
+++ b/sys/src/cmd/bzfs/oramfs.c
@@ -221,6 +221,8 @@ rversion(Fid*)
for(f = fids; f; f = f->next)
if(f->busy)
rclunk(f);
+ if(thdr.msize < 256)
+ return "message size too small";
if(thdr.msize > sizeof mdata)
rhdr.msize = sizeof mdata;
else
diff --git a/sys/src/cmd/cwfs/9p2.c b/sys/src/cmd/cwfs/9p2.c
index 8c34691f5..97fafe55f 100644
--- a/sys/src/cmd/cwfs/9p2.c
+++ b/sys/src/cmd/cwfs/9p2.c
@@ -113,7 +113,7 @@ mkdir9p2(Dir* dir, Dentry* dentry, void* strs)
static int
version(Chan* chan, Fcall* f, Fcall* r)
{
- if(chan->protocol != nil)
+ if(chan->protocol != nil || f->msize < 256)
return Eversion;
if(f->msize < MSIZE)
diff --git a/sys/src/cmd/disk/kfs/9p2.c b/sys/src/cmd/disk/kfs/9p2.c
index de99ebd8f..90510a409 100644
--- a/sys/src/cmd/disk/kfs/9p2.c
+++ b/sys/src/cmd/disk/kfs/9p2.c
@@ -15,6 +15,9 @@ seterror(Fcall *ou, int err)
static int
fsversion(Chan* chan, Fcall* f, Fcall* r)
{
+ if(f->msize < 256)
+ return Econvert;
+
if(f->msize < MSIZE)
r->msize = f->msize;
else
diff --git a/sys/src/cmd/exportfs/exportsrv.c b/sys/src/cmd/exportfs/exportsrv.c
index 842880529..7e8d836ff 100644
--- a/sys/src/cmd/exportfs/exportsrv.c
+++ b/sys/src/cmd/exportfs/exportsrv.c
@@ -26,11 +26,17 @@ Xversion(Fsrpc *t)
{
Fcall rhdr;
+ if(t->work.msize < 256){
+ reply(&t->work, &rhdr, "version: message size too small");
+ t->busy = 0;
+ return;
+ }
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);
+ t->busy = 0;
return;
}
rhdr.version = "9P2000";
diff --git a/sys/src/cmd/ip/ftpfs/ftpfs.c b/sys/src/cmd/ip/ftpfs/ftpfs.c
index 17e0df7b4..5d6f35b2e 100644
--- a/sys/src/cmd/ip/ftpfs/ftpfs.c
+++ b/sys/src/cmd/ip/ftpfs/ftpfs.c
@@ -304,11 +304,13 @@ rnop(Fid *f)
char*
rversion(Fid*)
{
- if(thdr.msize > sizeof(mdata))
- rhdr.msize = messagesize;
+ if(thdr.msize < 256)
+ return "version: message size too small";
+ if(thdr.msize > sizeof mdata)
+ rhdr.msize = sizeof mdata;
else
rhdr.msize = thdr.msize;
- messagesize = thdr.msize;
+ messagesize = rhdr.msize;
if(strncmp(thdr.version, "9P2000", 6) != 0)
return "unknown 9P version";
diff --git a/sys/src/cmd/unix/u9fs/u9fs.c b/sys/src/cmd/unix/u9fs/u9fs.c
index eeee21f12..b98ced8ba 100644
--- a/sys/src/cmd/unix/u9fs/u9fs.c
+++ b/sys/src/cmd/unix/u9fs/u9fs.c
@@ -355,6 +355,10 @@ serve(int rfd, int wfd)
void
rversion(Fcall *rx, Fcall *tx)
{
+ if(rx->msize < 256){
+ seterror(tx, "version: message size too small");
+ return;
+ }
if(msize > rx->msize)
msize = rx->msize;
tx->msize = msize;
diff --git a/sys/src/cmd/vnc/exportfs.c b/sys/src/cmd/vnc/exportfs.c
index 4948016d4..a2feb83ae 100644
--- a/sys/src/cmd/vnc/exportfs.c
+++ b/sys/src/cmd/vnc/exportfs.c
@@ -503,6 +503,8 @@ Exputfid(Export *fs, Fid *f)
static char*
Exversion(Export *fs, Fcall *rpc, uchar *)
{
+ if(rpc->msize < 256)
+ return "version: message size too small";
if(rpc->msize > Maxrpc)
rpc->msize = Maxrpc;
if(strncmp(rpc->version, "9P", 2) != 0){