@@ -3688,6 +3688,30 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
3688
3688
return - EINVAL ;
3689
3689
}
3690
3690
3691
+ static __be32
3692
+ nfsd4_encode_verifier4 (struct xdr_stream * xdr , const nfs4_verifier * verf )
3693
+ {
3694
+ __be32 * p ;
3695
+
3696
+ p = xdr_reserve_space (xdr , NFS4_VERIFIER_SIZE );
3697
+ if (!p )
3698
+ return nfserr_resource ;
3699
+ memcpy (p , verf -> data , sizeof (verf -> data ));
3700
+ return nfs_ok ;
3701
+ }
3702
+
3703
+ static __be32
3704
+ nfsd4_encode_clientid4 (struct xdr_stream * xdr , const clientid_t * clientid )
3705
+ {
3706
+ __be32 * p ;
3707
+
3708
+ p = xdr_reserve_space (xdr , sizeof (__be64 ));
3709
+ if (!p )
3710
+ return nfserr_resource ;
3711
+ memcpy (p , clientid , sizeof (* clientid ));
3712
+ return nfs_ok ;
3713
+ }
3714
+
3691
3715
static __be32
3692
3716
nfsd4_encode_stateid (struct xdr_stream * xdr , stateid_t * sid )
3693
3717
{
@@ -3752,15 +3776,8 @@ nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr,
3752
3776
union nfsd4_op_u * u )
3753
3777
{
3754
3778
struct nfsd4_commit * commit = & u -> commit ;
3755
- struct xdr_stream * xdr = resp -> xdr ;
3756
- __be32 * p ;
3757
3779
3758
- p = xdr_reserve_space (xdr , NFS4_VERIFIER_SIZE );
3759
- if (!p )
3760
- return nfserr_resource ;
3761
- p = xdr_encode_opaque_fixed (p , commit -> co_verf .data ,
3762
- NFS4_VERIFIER_SIZE );
3763
- return 0 ;
3780
+ return nfsd4_encode_verifier4 (resp -> xdr , & commit -> co_verf );
3764
3781
}
3765
3782
3766
3783
static __be32
@@ -4213,15 +4230,9 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr,
4213
4230
int starting_len = xdr -> buf -> len ;
4214
4231
__be32 * p ;
4215
4232
4216
- p = xdr_reserve_space (xdr , NFS4_VERIFIER_SIZE );
4217
- if (!p )
4218
- return nfserr_resource ;
4219
-
4220
- /* XXX: Following NFSv3, we ignore the READDIR verifier for now. */
4221
- * p ++ = cpu_to_be32 (0 );
4222
- * p ++ = cpu_to_be32 (0 );
4223
- xdr -> buf -> head [0 ].iov_len = (char * )xdr -> p -
4224
- (char * )xdr -> buf -> head [0 ].iov_base ;
4233
+ nfserr = nfsd4_encode_verifier4 (xdr , & readdir -> rd_verf );
4234
+ if (nfserr != nfs_ok )
4235
+ return nfserr ;
4225
4236
4226
4237
/*
4227
4238
* Number of bytes left for directory entries allowing for the
@@ -4448,23 +4459,25 @@ nfsd4_encode_setclientid(struct nfsd4_compoundres *resp, __be32 nfserr,
4448
4459
{
4449
4460
struct nfsd4_setclientid * scd = & u -> setclientid ;
4450
4461
struct xdr_stream * xdr = resp -> xdr ;
4451
- __be32 * p ;
4452
4462
4453
4463
if (!nfserr ) {
4454
- p = xdr_reserve_space (xdr , 8 + NFS4_VERIFIER_SIZE );
4455
- if (!p )
4456
- return nfserr_resource ;
4457
- p = xdr_encode_opaque_fixed (p , & scd -> se_clientid , 8 );
4458
- p = xdr_encode_opaque_fixed (p , & scd -> se_confirm ,
4459
- NFS4_VERIFIER_SIZE );
4460
- }
4461
- else if (nfserr == nfserr_clid_inuse ) {
4462
- p = xdr_reserve_space (xdr , 8 );
4463
- if (!p )
4464
- return nfserr_resource ;
4465
- * p ++ = cpu_to_be32 (0 );
4466
- * p ++ = cpu_to_be32 (0 );
4464
+ nfserr = nfsd4_encode_clientid4 (xdr , & scd -> se_clientid );
4465
+ if (nfserr != nfs_ok )
4466
+ goto out ;
4467
+ nfserr = nfsd4_encode_verifier4 (xdr , & scd -> se_confirm );
4468
+ } else if (nfserr == nfserr_clid_inuse ) {
4469
+ /* empty network id */
4470
+ if (xdr_stream_encode_u32 (xdr , 0 ) < 0 ) {
4471
+ nfserr = nfserr_resource ;
4472
+ goto out ;
4473
+ }
4474
+ /* empty universal address */
4475
+ if (xdr_stream_encode_u32 (xdr , 0 ) < 0 ) {
4476
+ nfserr = nfserr_resource ;
4477
+ goto out ;
4478
+ }
4467
4479
}
4480
+ out :
4468
4481
return nfserr ;
4469
4482
}
4470
4483
@@ -4473,17 +4486,12 @@ nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr,
4473
4486
union nfsd4_op_u * u )
4474
4487
{
4475
4488
struct nfsd4_write * write = & u -> write ;
4476
- struct xdr_stream * xdr = resp -> xdr ;
4477
- __be32 * p ;
4478
4489
4479
- p = xdr_reserve_space (xdr , 16 );
4480
- if (!p )
4490
+ if (xdr_stream_encode_u32 (resp -> xdr , write -> wr_bytes_written ) < 0 )
4481
4491
return nfserr_resource ;
4482
- * p ++ = cpu_to_be32 (write -> wr_bytes_written );
4483
- * p ++ = cpu_to_be32 (write -> wr_how_written );
4484
- p = xdr_encode_opaque_fixed (p , write -> wr_verifier .data ,
4485
- NFS4_VERIFIER_SIZE );
4486
- return 0 ;
4492
+ if (xdr_stream_encode_u32 (resp -> xdr , write -> wr_how_written ) < 0 )
4493
+ return nfserr_resource ;
4494
+ return nfsd4_encode_verifier4 (resp -> xdr , & write -> wr_verifier );
4487
4495
}
4488
4496
4489
4497
static __be32
@@ -4505,20 +4513,15 @@ nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr,
4505
4513
server_scope = nn -> nfsd_name ;
4506
4514
server_scope_sz = strlen (nn -> nfsd_name );
4507
4515
4508
- p = xdr_reserve_space (xdr ,
4509
- 8 /* eir_clientid */ +
4510
- 4 /* eir_sequenceid */ +
4511
- 4 /* eir_flags */ +
4512
- 4 /* spr_how */ );
4513
- if (!p )
4516
+ if (nfsd4_encode_clientid4 (xdr , & exid -> clientid ) != nfs_ok )
4517
+ return nfserr_resource ;
4518
+ if (xdr_stream_encode_u32 (xdr , exid -> seqid ) < 0 )
4519
+ return nfserr_resource ;
4520
+ if (xdr_stream_encode_u32 (xdr , exid -> flags ) < 0 )
4514
4521
return nfserr_resource ;
4515
4522
4516
- p = xdr_encode_opaque_fixed (p , & exid -> clientid , 8 );
4517
- * p ++ = cpu_to_be32 (exid -> seqid );
4518
- * p ++ = cpu_to_be32 (exid -> flags );
4519
-
4520
- * p ++ = cpu_to_be32 (exid -> spa_how );
4521
-
4523
+ if (xdr_stream_encode_u32 (xdr , exid -> spa_how ) < 0 )
4524
+ return nfserr_resource ;
4522
4525
switch (exid -> spa_how ) {
4523
4526
case SP4_NONE :
4524
4527
break ;
0 commit comments