X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=fs%2Fxattr.c;h=cd786d53c611d5c4e25f8c858e38c6e376f3417e;hb=b1c1c6b2c29151718f818877e5978de972cc302e;hp=7444fb1b348455d1ef0e3f26805f3b6d82b21fa9;hpb=7411c392ab8137f376a2f3a9f292ff7eb910bcfb;p=sagit-ice-cold%2Fkernel_xiaomi_msm8998.git diff --git a/fs/xattr.c b/fs/xattr.c index 7444fb1b3484..cd786d53c611 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -430,6 +430,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, void *kvalue = NULL; void *vvalue = NULL; char kname[XATTR_NAME_MAX + 1]; + char kvalue_onstack[SZ_4K] __aligned(sizeof(long)); error = strncpy_from_user(kname, name, sizeof(kname)); if (error == 0 || error == sizeof(kname)) @@ -438,14 +439,19 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, return error; if (size) { - if (size > XATTR_SIZE_MAX) - size = XATTR_SIZE_MAX; - kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); - if (!kvalue) { - vvalue = vzalloc(size); - if (!vvalue) - return -ENOMEM; - kvalue = vvalue; + if (size <= ARRAY_SIZE(kvalue_onstack)) { + kvalue = kvalue_onstack; + memset(kvalue, 0, size); + } else { + if (size > XATTR_SIZE_MAX) + size = XATTR_SIZE_MAX; + kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); + if (!kvalue) { + vvalue = vzalloc(size); + if (!vvalue) + return -ENOMEM; + kvalue = vvalue; + } } } @@ -463,7 +469,7 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, } if (vvalue) vfree(vvalue); - else + else if (kvalue != kvalue_onstack) kfree(kvalue); return error; }