Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / fs / f2fs / xattr.c
index 89d0422a91a88fea51ecf5935d31c2920545f8a6..503c2451131e5ba78b26fcce09870b0ca1a3d9bb 100644 (file)
@@ -275,7 +275,7 @@ static void *read_all_xattrs(struct inode *inode, struct page *ipage)
 
        inline_size = inline_xattr_size(inode);
 
-       txattr_addr = kzalloc(inline_size + size, GFP_KERNEL);
+       txattr_addr = kzalloc(inline_size + size, GFP_F2FS_ZERO);
        if (!txattr_addr)
                return NULL;
 
@@ -407,6 +407,8 @@ int f2fs_getxattr(struct inode *inode, int name_index, const char *name,
        if (name == NULL)
                return -EINVAL;
        name_len = strlen(name);
+       if (name_len > F2FS_NAME_LEN)
+               return -ERANGE;
 
        base_addr = read_all_xattrs(inode, NULL);
        if (!base_addr)
@@ -590,7 +592,10 @@ int f2fs_setxattr(struct inode *inode, int name_index, const char *name,
        f2fs_balance_fs(sbi);
 
        f2fs_lock_op(sbi);
+       /* protect xattr_ver */
+       down_write(&F2FS_I(inode)->i_sem);
        err = __f2fs_setxattr(inode, name_index, name, value, value_len, ipage);
+       up_write(&F2FS_I(inode)->i_sem);
        f2fs_unlock_op(sbi);
 
        return err;