From: Andreas Gruenbacher <agruen@suse.de>

The attached patch kmallocs the buffer if needed.  This uglifies the code
quite a bit though...

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/net/sunrpc/xdr.c |   27 +++++++++++++++++++++++++--
 1 files changed, 25 insertions(+), 2 deletions(-)

diff -puN net/sunrpc/xdr.c~nfsacl-encode-and-decode-arbitrary-xdr-arrays-fix2 net/sunrpc/xdr.c
--- 25/net/sunrpc/xdr.c~nfsacl-encode-and-decode-arbitrary-xdr-arrays-fix2	Thu Feb 17 17:16:26 2005
+++ 25-akpm/net/sunrpc/xdr.c	Thu Feb 17 17:16:26 2005
@@ -964,10 +964,10 @@ static int
 xdr_xcode_array2(struct xdr_buf *buf, unsigned int base,
 		 struct xdr_array2_desc *desc, int encode)
 {
-	char elem[desc->elem_size], *c;
+	char *elem = NULL, *c;
 	unsigned int copied = 0, todo, avail_here;
 	struct page **ppages = NULL;
-	int err = 0;
+	int err;
 
 	if (encode) {
 		if (xdr_encode_word(buf, base, desc->array_len) != 0)
@@ -1000,6 +1000,12 @@ xdr_xcode_array2(struct xdr_buf *buf, un
 			avail_here -= desc->elem_size;
 		}
 		if (avail_here) {
+			if (!elem) {
+				elem = kmalloc(desc->elem_size, GFP_KERNEL);
+				err = -ENOMEM;
+				if (!elem)
+					goto out;
+			}
 			if (encode) {
 				err = desc->xcode(desc, elem);
 				if (err)
@@ -1032,6 +1038,13 @@ xdr_xcode_array2(struct xdr_buf *buf, un
 			if (copied || avail_page < desc->elem_size) {
 				unsigned int l = min(avail_page,
 					desc->elem_size - copied);
+				if (!elem) {
+					elem = kmalloc(desc->elem_size,
+						       GFP_KERNEL);
+					err = -ENOMEM;
+					if (!elem)
+						goto out;
+				}
 				if (encode) {
 					if (!copied) {
 						err = desc->xcode(desc, elem);
@@ -1065,6 +1078,13 @@ xdr_xcode_array2(struct xdr_buf *buf, un
 			if (avail_page) {
 				unsigned int l = min(avail_page,
 					    desc->elem_size - copied);
+				if (!elem) {
+					elem = kmalloc(desc->elem_size,
+						       GFP_KERNEL);
+					err = -ENOMEM;
+					if (!elem)
+						goto out;
+				}
 				if (encode) {
 					if (!copied) {
 						err = desc->xcode(desc, elem);
@@ -1124,8 +1144,11 @@ xdr_xcode_array2(struct xdr_buf *buf, un
 			todo -= desc->elem_size;
 		}
 	}
+	err = 0;
 
 out:
+	if (elem)
+		kfree(elem);
 	if (ppages)
 		kunmap(*ppages);
 	return err;
_