From d32d99b652b72ad6d6e387b6ce796cd50eedc93e Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 5 Apr 2012 14:25:07 -0700 Subject: [PATCH] --- yaml --- r: 298647 b: refs/heads/master c: 0d08d7b7e13b5060181b11ecdde82d8fda322123 h: refs/heads/master i: 298645: cc1a91cee7ad1b594b8d7d76c20e4899723d6661 298643: 54aaad6bf577f180f1cb0f1c529dccd9f396606f 298639: 353c7541d10de571acd9a610cf6a86503dfebdc0 v: v3 --- [refs] | 2 +- trunk/fs/xattr.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index f8fa5bda7d27..4c544c977de1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 703bf2d122c95412a30f72658c53ad6292867b0b +refs/heads/master: 0d08d7b7e13b5060181b11ecdde82d8fda322123 diff --git a/trunk/fs/xattr.c b/trunk/fs/xattr.c index a14d842ccb21..d14afbae3c13 100644 --- a/trunk/fs/xattr.c +++ b/trunk/fs/xattr.c @@ -19,8 +19,9 @@ #include #include #include -#include +#include +#include /* * Check permissions for extended attribute access. This is a bit complicated @@ -492,13 +493,18 @@ listxattr(struct dentry *d, char __user *list, size_t size) { ssize_t error; char *klist = NULL; + char *vlist = NULL; /* If non-NULL, we used vmalloc() */ if (size) { if (size > XATTR_LIST_MAX) size = XATTR_LIST_MAX; klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); - if (!klist) - return -ENOMEM; + if (!klist) { + vlist = vmalloc(size); + if (!vlist) + return -ENOMEM; + klist = vlist; + } } error = vfs_listxattr(d, klist, size); @@ -510,7 +516,10 @@ listxattr(struct dentry *d, char __user *list, size_t size) than XATTR_LIST_MAX bytes. Not possible. */ error = -E2BIG; } - kfree(klist); + if (vlist) + vfree(vlist); + else + kfree(klist); return error; }