[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <65cdbbab-7dca-4a73-af07-29863ab8f526@stanley.mountain>
Date: Mon, 16 Sep 2024 18:14:15 +0300
From: Dan Carpenter <dan.carpenter@...aro.org>
To: Chuck Lever <chuck.lever@...cle.com>
Cc: Jeff Layton <jlayton@...nel.org>, Neil Brown <neilb@...e.de>,
Olga Kornievskaia <okorniev@...hat.com>,
Dai Ngo <Dai.Ngo@...cle.com>, Tom Talpey <tom@...pey.com>,
linux-nfs@...r.kernel.org, linux-kernel@...r.kernel.org,
kernel-janitors@...r.kernel.org
Subject: [PATCH] nfsd: prevent integer overflow in decode_cb_compound4res()
If "length" is >= U32_MAX - 3 then the "length + 4" addition can result
in an integer overflow. The impact of this bug is not totally clear to
me, but it's safer to not allow the integer overflow.
There is also some math in xdr_inline_decode() which could overflow, so
really it's ">= U32_MAX - 7" which is problematic. Let's just check
against INT_MAX and make it easy.
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Dan Carpenter <dan.carpenter@...aro.org>
---
fs/nfsd/nfs4callback.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 43b8320c8255..12b44c9246d1 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -317,6 +317,8 @@ static int decode_cb_compound4res(struct xdr_stream *xdr,
hdr->status = be32_to_cpup(p++);
/* Ignore the tag */
length = be32_to_cpup(p++);
+ if (unlikely(length > INT_MAX))
+ goto out_overflow;
p = xdr_inline_decode(xdr, length + 4);
if (unlikely(p == NULL))
goto out_overflow;
--
2.45.2
Powered by blists - more mailing lists