diff options
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index d9eac7069101..3e19d321067a 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1181,6 +1181,17 @@ call_verify(struct rpc_task *task) | |||
1181 | u32 *p = iov->iov_base, n; | 1181 | u32 *p = iov->iov_base, n; |
1182 | int error = -EACCES; | 1182 | int error = -EACCES; |
1183 | 1183 | ||
1184 | if ((task->tk_rqstp->rq_rcv_buf.len & 3) != 0) { | ||
1185 | /* RFC-1014 says that the representation of XDR data must be a | ||
1186 | * multiple of four bytes | ||
1187 | * - if it isn't pointer subtraction in the NFS client may give | ||
1188 | * undefined results | ||
1189 | */ | ||
1190 | printk(KERN_WARNING | ||
1191 | "call_verify: XDR representation not a multiple of" | ||
1192 | " 4 bytes: 0x%x\n", task->tk_rqstp->rq_rcv_buf.len); | ||
1193 | goto out_eio; | ||
1194 | } | ||
1184 | if ((len -= 3) < 0) | 1195 | if ((len -= 3) < 0) |
1185 | goto out_overflow; | 1196 | goto out_overflow; |
1186 | p += 1; /* skip XID */ | 1197 | p += 1; /* skip XID */ |