aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2025-10-27 14:49:32 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2025-10-27 14:49:32 +0000
commit2c82cdd2e29f8ba00d4289f36f8baa1598a1ad9b (patch)
treec34d11fc973f75881d42ed7736dde5f5b8bc290c
parentb9e6206f593385c80436d267ab759319c1e94e43 (diff)
nfs_clrpcops.c: Check for too large a write reply
The "rlen" reply length for a Write operation/RPC could cause trouble if a broken server replies with too large a value. Improve the sanity check for "rlen" to avoid this. Reported by: Ilja Van Sprundel <ivansprundel@ioactive.com> Reviewed by: emaste, markj MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D53368
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index c8a130c34412..983eb8b9226f 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -2212,7 +2212,7 @@ nfsrpc_writerpc(vnode_t vp, struct uio *uiop, int *iomode,
NFSM_DISSECT(tl, u_int32_t *, 2 * NFSX_UNSIGNED
+ NFSX_VERF);
rlen = fxdr_unsigned(int, *tl++);
- if (rlen == 0) {
+ if (rlen <= 0 || rlen > len) {
error = NFSERR_IO;
goto nfsmout;
} else if (rlen < len) {
@@ -7257,7 +7257,7 @@ nfsrpc_writeds(vnode_t vp, struct uio *uiop, int *iomode, int *must_commit,
NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED + NFSX_VERF);
rlen = fxdr_unsigned(int, *tl++);
NFSCL_DEBUG(4, "nfsrpc_writeds: len=%d rlen=%d\n", len, rlen);
- if (rlen == 0) {
+ if (rlen <= 0 || rlen > len) {
error = NFSERR_IO;
goto nfsmout;
} else if (rlen < len) {