9p: cope with bogus responses from server in p9_client_{read,write}
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 4 Jul 2015 20:17:39 +0000 (16:17 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 4 Jul 2015 20:17:39 +0000 (16:17 -0400)
if server claims to have written/read more than we'd told it to,
warn and cap the claimed byte count to avoid advancing more than
we are ready to.

net/9p/client.c

index 81925b9233185380482ecf59cb669383b0244615..498454b3c06c3ddf0e8c3989e23bef9360587544 100644 (file)
@@ -1583,6 +1583,10 @@ p9_client_read(struct p9_fid *fid, u64 offset, struct iov_iter *to, int *err)
                        p9_free_req(clnt, req);
                        break;
                }
+               if (rsize < count) {
+                       pr_err("bogus RREAD count (%d > %d)\n", count, rsize);
+                       count = rsize;
+               }
 
                p9_debug(P9_DEBUG_9P, "<<< RREAD count %d\n", count);
                if (!count) {
@@ -1650,6 +1654,10 @@ p9_client_write(struct p9_fid *fid, u64 offset, struct iov_iter *from, int *err)
                        p9_free_req(clnt, req);
                        break;
                }
+               if (rsize < count) {
+                       pr_err("bogus RWRITE count (%d > %d)\n", count, rsize);
+                       count = rsize;
+               }
 
                p9_debug(P9_DEBUG_9P, "<<< RWRITE count %d\n", count);