X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=fs%2Fxattr.c;h=4d45b7189e7eaa352da0567b8fe4a2d1b738c999;hb=868f480bed5266347b168c2bbe7b010cf9cac1dd;hp=1d7ac379045879b827b196f0d7a7420fe33c783d;hpb=d14b7a419a664cd7c1c585c9e7fffee9e9051d53;p=profile%2Fivi%2Fkernel-x86-ivi.git diff --git a/fs/xattr.c b/fs/xattr.c index 1d7ac37..4d45b71 100644 --- a/fs/xattr.c +++ b/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; }