summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cwfs
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-07-24 02:21:32 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-07-24 02:21:32 +0200
commita0d4c5e208405f84076891faaa43235bb2b87fc2 (patch)
tree9549cd4cd11c57e3c72d31f4a0424c75b1d5a063 /sys/src/cmd/cwfs
parenta840b597cad282e837560b65dad89aa0cfd4af77 (diff)
make error handling in 9p service loops consistent
when we get eof, stop the loop immidiately and do not rely on the read to eventually return an error. when convM2S() fails to decode the message, error out and stop the loop. there is no point in continuing.
Diffstat (limited to 'sys/src/cmd/cwfs')
-rw-r--r--sys/src/cmd/cwfs/srv.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/src/cmd/cwfs/srv.c b/sys/src/cmd/cwfs/srv.c
index b3f5d7b65..e022b9fbf 100644
--- a/sys/src/cmd/cwfs/srv.c
+++ b/sys/src/cmd/cwfs/srv.c
@@ -104,8 +104,9 @@ srvi(void *aux)
Msgbuf *mb, *ms;
uchar *b, *p, *e;
int n, m;
- char buf[ERRMAX];
+ char err[ERRMAX];
+ err[0] = 0;
chan = aux;
srv = chan->pdata;
@@ -116,13 +117,13 @@ srvi(void *aux)
e = b + mb->count;
Read:
- while((n = read(srv->fd, p, e - p)) >= 0){
+ while((n = read(srv->fd, p, e - p)) > 0){
p += n;
while((p - b) >= BIT32SZ){
m = GBIT32(b);
if((m < BIT32SZ) || (m > mb->count)){
- werrstr("bad length in 9P2000 message header");
- goto Error;
+ strcpy(err, "bad length in 9P2000 message header");
+ goto Hangup;
}
if((n = (p - b) - m) < 0){
e = b + m;
@@ -149,12 +150,11 @@ Read:
e = b + mb->count;
}
-Error:
- rerrstr(buf, sizeof(buf));
- if(strstr(buf, "interrupt"))
- goto Read;
+ if(n < 0)
+ errstr(err, sizeof(err));
- chanhangup(chan, buf);
+Hangup:
+ chanhangup(chan, err);
srvput(srv);
mbfree(mb);