<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Andreas Gruenbacher &lt;agruen@suse.de&gt;

The bounds check in xdr_xcode_array2 can overflow.  Reported by Florian
Weimer &lt;fw@deneb.enyo.de&gt;.

Signed-off-by: Andreas Gruenbacher &lt;agruen@suse.de&gt;
Cc: Trond Myklebust &lt;trond.myklebust@fys.uio.no&gt;
Cc: Neil Brown &lt;neilb@cse.unsw.edu.au&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 net/sunrpc/xdr.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff -puN net/sunrpc/xdr.c~xdr-input-validation net/sunrpc/xdr.c
--- 25/net/sunrpc/xdr.c~xdr-input-validation	Fri Jun 24 17:04:17 2005
+++ 25-akpm/net/sunrpc/xdr.c	Fri Jun 24 17:04:17 2005
@@ -993,8 +993,7 @@ xdr_xcode_array2(struct xdr_buf *buf, un
 			return -EINVAL;
 	} else {
 		if (xdr_decode_word(buf, base, &amp;desc-&gt;array_len) != 0 ||
-		    (unsigned long) base + 4 + desc-&gt;array_len *
-				    desc-&gt;elem_size &gt; buf-&gt;len)
+		    desc-&gt;array_len &gt; (buf-&gt;len - base - 4) / desc-&gt;elem_size)
 			return -EINVAL;
 	}
 	base += 4;
@@ -1187,8 +1186,8 @@ int
 xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
 		  struct xdr_array2_desc *desc)
 {
-	if ((unsigned long) base + 4 + desc-&gt;array_len * desc-&gt;elem_size &gt;
-	    buf-&gt;head-&gt;iov_len + buf-&gt;page_len + buf-&gt;tail-&gt;iov_len)
+	if (buf-&gt;head-&gt;iov_len + buf-&gt;page_len + buf-&gt;tail-&gt;iov_len -
+	    base &lt; desc-&gt;array_len * desc-&gt;elem_size + 4)
 		return -EINVAL;
 
 	return xdr_xcode_array2(buf, base, desc, 1);
_
</pre></body></html>