|
@@ -18,19 +18,21 @@
|
|
#include "internal.h"
|
|
#include "internal.h"
|
|
#include "nfs4session.h"
|
|
#include "nfs4session.h"
|
|
|
|
|
|
-#define CB_OP_TAGLEN_MAXSZ (512)
|
|
|
|
-#define CB_OP_HDR_RES_MAXSZ (2 + CB_OP_TAGLEN_MAXSZ)
|
|
|
|
-#define CB_OP_GETATTR_BITMAP_MAXSZ (4)
|
|
|
|
-#define CB_OP_GETATTR_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
|
|
- CB_OP_GETATTR_BITMAP_MAXSZ + \
|
|
|
|
- 2 + 2 + 3 + 3)
|
|
|
|
-#define CB_OP_RECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
|
|
|
|
+#define CB_OP_TAGLEN_MAXSZ (512)
|
|
|
|
+#define CB_OP_HDR_RES_MAXSZ (2 * 4) // opcode, status
|
|
|
|
+#define CB_OP_GETATTR_BITMAP_MAXSZ (4 * 4) // bitmap length, 3 bitmaps
|
|
|
|
+#define CB_OP_GETATTR_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
|
|
+ CB_OP_GETATTR_BITMAP_MAXSZ + \
|
|
|
|
+ /* change, size, ctime, mtime */\
|
|
|
|
+ (2 + 2 + 3 + 3) * 4)
|
|
|
|
+#define CB_OP_RECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
|
|
|
|
#if defined(CONFIG_NFS_V4_1)
|
|
#if defined(CONFIG_NFS_V4_1)
|
|
#define CB_OP_LAYOUTRECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_LAYOUTRECALL_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_DEVICENOTIFY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_DEVICENOTIFY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
#define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \
|
|
- 4 + 1 + 3)
|
|
|
|
|
|
+ NFS4_MAX_SESSIONID_LEN + \
|
|
|
|
+ (1 + 3) * 4) // seqid, 3 slotids
|
|
#define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_RECALLSLOT_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#define CB_OP_RECALLSLOT_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ)
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
@@ -157,7 +159,7 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound
|
|
if (unlikely(status != 0))
|
|
if (unlikely(status != 0))
|
|
return status;
|
|
return status;
|
|
/* We do not like overly long tags! */
|
|
/* We do not like overly long tags! */
|
|
- if (hdr->taglen > CB_OP_TAGLEN_MAXSZ - 12) {
|
|
|
|
|
|
+ if (hdr->taglen > CB_OP_TAGLEN_MAXSZ) {
|
|
printk("NFS: NFSv4 CALLBACK %s: client sent tag of length %u\n",
|
|
printk("NFS: NFSv4 CALLBACK %s: client sent tag of length %u\n",
|
|
__func__, hdr->taglen);
|
|
__func__, hdr->taglen);
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
@@ -198,7 +200,6 @@ static __be32 decode_getattr_args(struct svc_rqst *rqstp, struct xdr_stream *xdr
|
|
status = decode_fh(xdr, &args->fh);
|
|
status = decode_fh(xdr, &args->fh);
|
|
if (unlikely(status != 0))
|
|
if (unlikely(status != 0))
|
|
goto out;
|
|
goto out;
|
|
- args->addr = svc_addr(rqstp);
|
|
|
|
status = decode_bitmap(xdr, args->bitmap);
|
|
status = decode_bitmap(xdr, args->bitmap);
|
|
out:
|
|
out:
|
|
dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
|
|
dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
|
|
@@ -210,7 +211,6 @@ static __be32 decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|
__be32 *p;
|
|
__be32 *p;
|
|
__be32 status;
|
|
__be32 status;
|
|
|
|
|
|
- args->addr = svc_addr(rqstp);
|
|
|
|
status = decode_stateid(xdr, &args->stateid);
|
|
status = decode_stateid(xdr, &args->stateid);
|
|
if (unlikely(status != 0))
|
|
if (unlikely(status != 0))
|
|
goto out;
|
|
goto out;
|
|
@@ -236,7 +236,6 @@ static __be32 decode_layoutrecall_args(struct svc_rqst *rqstp,
|
|
__be32 status = 0;
|
|
__be32 status = 0;
|
|
uint32_t iomode;
|
|
uint32_t iomode;
|
|
|
|
|
|
- args->cbl_addr = svc_addr(rqstp);
|
|
|
|
p = read_buf(xdr, 4 * sizeof(uint32_t));
|
|
p = read_buf(xdr, 4 * sizeof(uint32_t));
|
|
if (unlikely(p == NULL)) {
|
|
if (unlikely(p == NULL)) {
|
|
status = htonl(NFS4ERR_BADXDR);
|
|
status = htonl(NFS4ERR_BADXDR);
|
|
@@ -383,13 +382,12 @@ static __be32 decode_sessionid(struct xdr_stream *xdr,
|
|
struct nfs4_sessionid *sid)
|
|
struct nfs4_sessionid *sid)
|
|
{
|
|
{
|
|
__be32 *p;
|
|
__be32 *p;
|
|
- int len = NFS4_MAX_SESSIONID_LEN;
|
|
|
|
|
|
|
|
- p = read_buf(xdr, len);
|
|
|
|
|
|
+ p = read_buf(xdr, NFS4_MAX_SESSIONID_LEN);
|
|
if (unlikely(p == NULL))
|
|
if (unlikely(p == NULL))
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
|
|
|
|
- memcpy(sid->data, p, len);
|
|
|
|
|
|
+ memcpy(sid->data, p, NFS4_MAX_SESSIONID_LEN);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -500,7 +498,6 @@ static __be32 decode_recallany_args(struct svc_rqst *rqstp,
|
|
uint32_t bitmap[2];
|
|
uint32_t bitmap[2];
|
|
__be32 *p, status;
|
|
__be32 *p, status;
|
|
|
|
|
|
- args->craa_addr = svc_addr(rqstp);
|
|
|
|
p = read_buf(xdr, 4);
|
|
p = read_buf(xdr, 4);
|
|
if (unlikely(p == NULL))
|
|
if (unlikely(p == NULL))
|
|
return htonl(NFS4ERR_BADXDR);
|
|
return htonl(NFS4ERR_BADXDR);
|
|
@@ -519,7 +516,6 @@ static __be32 decode_recallslot_args(struct svc_rqst *rqstp,
|
|
{
|
|
{
|
|
__be32 *p;
|
|
__be32 *p;
|
|
|
|
|
|
- args->crsa_addr = svc_addr(rqstp);
|
|
|
|
p = read_buf(xdr, 4);
|
|
p = read_buf(xdr, 4);
|
|
if (unlikely(p == NULL))
|
|
if (unlikely(p == NULL))
|
|
return htonl(NFS4ERR_BADXDR);
|
|
return htonl(NFS4ERR_BADXDR);
|
|
@@ -684,13 +680,12 @@ static __be32 encode_sessionid(struct xdr_stream *xdr,
|
|
const struct nfs4_sessionid *sid)
|
|
const struct nfs4_sessionid *sid)
|
|
{
|
|
{
|
|
__be32 *p;
|
|
__be32 *p;
|
|
- int len = NFS4_MAX_SESSIONID_LEN;
|
|
|
|
|
|
|
|
- p = xdr_reserve_space(xdr, len);
|
|
|
|
|
|
+ p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN);
|
|
if (unlikely(p == NULL))
|
|
if (unlikely(p == NULL))
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
return htonl(NFS4ERR_RESOURCE);
|
|
|
|
|
|
- memcpy(p, sid, len);
|
|
|
|
|
|
+ memcpy(p, sid, NFS4_MAX_SESSIONID_LEN);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -704,7 +699,9 @@ static __be32 encode_cb_sequence_res(struct svc_rqst *rqstp,
|
|
if (unlikely(status != 0))
|
|
if (unlikely(status != 0))
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- encode_sessionid(xdr, &res->csr_sessionid);
|
|
|
|
|
|
+ status = encode_sessionid(xdr, &res->csr_sessionid);
|
|
|
|
+ if (status)
|
|
|
|
+ goto out;
|
|
|
|
|
|
p = xdr_reserve_space(xdr, 4 * sizeof(uint32_t));
|
|
p = xdr_reserve_space(xdr, 4 * sizeof(uint32_t));
|
|
if (unlikely(p == NULL))
|
|
if (unlikely(p == NULL))
|