From: Andreas Gruenbacher The attached patch kmallocs the buffer if needed. This uglifies the code quite a bit though... Signed-off-by: Andrew Morton --- 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; _