Patch "ovl: use a minimal buffer in ovl_copy_xattr" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ovl: use a minimal buffer in ovl_copy_xattr
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ovl-use-a-minimal-buffer-in-ovl_copy_xattr.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
e4ad29fa0d224d05e08b2858e65f112fd8edd4feMon Sep 17 00:00:00 2001
From: Vito Caputo <[email protected]>
Date: Sat, 24 Oct 2015 07:19:46 -0500
Subject: ovl: use a minimal buffer in ovl_copy_xattr
From: Vito Caputo <[email protected]>
commit e4ad29fa0d224d05e08b2858e65f112fd8edd4fe upstream.
Rather than always allocating the high-order XATTR_SIZE_MAX buffer which is costly and prone to failure, only allocate what is needed and realloc if necessary.
Fixes https://github.com/coreos/bugs/issues/489
--- fs/overlayfs/copy_up.c | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-)
fs/overlayfs/copy_up.c +25 -14
@@ -22,9 +22,9 @@int ovl_copy_xattr (struct dentry *old,struct dentry *new) { -ssize_t list_size, size; -char *buf, *name, *value; -int error; +ssize_t list_size, size, value_size =0 ; +char *buf, *name, *value =NULL ; +int uninitialized_var (error );if (!old->d_inode->i_op->getxattr || !new->d_inode->i_op->getxattr)
@@ -41,29 +41,40 @@ int ovl_copy_xattr(struct dentry *old, sif (!buf)return -ENOMEM ; - error = -ENOMEM ; - value =kmalloc (XATTR_SIZE_MAX ,GFP_KERNEL ); -if (!value) - goto out; - list_size =vfs_listxattr (old, buf, list_size);if (list_size <=0 ) { error = list_size; - goto out_free_value; + goto out; }for (name = buf; name < (buf + list_size); name +=strlen (name) +1 ) { - size =vfs_getxattr (old, name, value,XATTR_SIZE_MAX ); +retry: + size =vfs_getxattr (old, name, value, value_size); +if (size == -ERANGE ) + size =vfs_getxattr (old, name,NULL ,0 ); +if (size <0 ) { error = size; - goto out_free_value; +break ; } + +if (size > value_size) { +void *new; + + new =krealloc (value, size,GFP_KERNEL ); +if (!new) { + error = -ENOMEM ; +break ; + } + value = new; + value_size = size; + goto retry; + } + error =vfs_setxattr (new, name, value, size,0 );if (error) - goto out_free_value; +break ; } - -out_free_value:kfree (value); out:kfree (buf);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/ovl-use-a-minimal-buffer-in-ovl_copy_xattr.patch