From 2fcbf9520af92c8895163f2a1423a06cefb0ed1c Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 30 Jul 2012 14:39:13 -0700 Subject: [PATCH] --- yaml --- r: 319874 b: refs/heads/master c: 779302e67835fe9a6b74327e54969ba59cb3478a h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/xattr.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index b6f0c5ae9af4..7b54a68dcbef 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 32b4560b04af6e4fee241ea6de6db780eaf354f2 +refs/heads/master: 779302e67835fe9a6b74327e54969ba59cb3478a diff --git a/trunk/fs/xattr.c b/trunk/fs/xattr.c index 1d7ac3790458..4d45b7189e7e 100644 --- a/trunk/fs/xattr.c +++ b/trunk/fs/xattr.c @@ -427,6 +427,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, { ssize_t error; void *kvalue = NULL; + void *vvalue = NULL; char kname[XATTR_NAME_MAX + 1]; error = strncpy_from_user(kname, name, sizeof(kname)); @@ -438,9 +439,13 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, if (size) { if (size > XATTR_SIZE_MAX) size = XATTR_SIZE_MAX; - kvalue = kzalloc(size, GFP_KERNEL); - if (!kvalue) - return -ENOMEM; + kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); + if (!kvalue) { + vvalue = vmalloc(size); + if (!vvalue) + return -ENOMEM; + kvalue = vvalue; + } } error = vfs_getxattr(d, kname, kvalue, size); @@ -452,7 +457,10 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, than XATTR_SIZE_MAX bytes. Not possible. */ error = -E2BIG; } - kfree(kvalue); + if (vvalue) + vfree(vvalue); + else + kfree(kvalue); return error; }