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))
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;
+ }
}
}
}
if (vvalue)
vfree(vvalue);
- else
+ else if (kvalue != kvalue_onstack)
kfree(kvalue);
return error;
}