mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-23 07:21:14 +02:00
coreos-sources: add patch minimizing allocation in ovl_copy_xattr
Fixes https://github.com/coreos/bugs/issues/489
This commit is contained in:
parent
dfff9ce124
commit
d35619266f
@ -32,4 +32,5 @@ ${PATCH_DIR}/overlayfs/0002-Overlayfs-Use-copy-up-security-hooks.patch \
|
|||||||
${PATCH_DIR}/overlayfs/0003-SELinux-Stub-in-copy-up-handling.patch \
|
${PATCH_DIR}/overlayfs/0003-SELinux-Stub-in-copy-up-handling.patch \
|
||||||
${PATCH_DIR}/overlayfs/0004-SELinux-Handle-opening-of-a-unioned-file.patch \
|
${PATCH_DIR}/overlayfs/0004-SELinux-Handle-opening-of-a-unioned-file.patch \
|
||||||
${PATCH_DIR}/overlayfs/0005-SELinux-Check-against-union-label-for-file-operation.patch \
|
${PATCH_DIR}/overlayfs/0005-SELinux-Check-against-union-label-for-file-operation.patch \
|
||||||
|
${PATCH_DIR}/overlayfs/0006-overlayfs-use-a-minimal-buffer-in-ovl_copy_xattr.patch \
|
||||||
${PATCH_DIR}/net-wireless-wl18xx-Add-missing-MODULE_FIRMWARE.patch"
|
${PATCH_DIR}/net-wireless-wl18xx-Add-missing-MODULE_FIRMWARE.patch"
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
From 885f27cadbb562bb405c258ab6053f52efbf4de7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vito Caputo <vito.caputo@coreos.com>
|
||||||
|
Date: Mon, 19 Oct 2015 17:53:12 -0700
|
||||||
|
Subject: [PATCH] overlayfs: use a minimal buffer in ovl_copy_xattr
|
||||||
|
|
||||||
|
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 | 31 ++++++++++++++++++++++---------
|
||||||
|
1 file changed, 22 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
|
||||||
|
index 8f66b39..9426e60 100644
|
||||||
|
--- a/fs/overlayfs/copy_up.c
|
||||||
|
+++ b/fs/overlayfs/copy_up.c
|
||||||
|
@@ -22,8 +22,8 @@
|
||||||
|
|
||||||
|
int ovl_copy_xattr(struct dentry *old, struct dentry *new)
|
||||||
|
{
|
||||||
|
- ssize_t list_size, size;
|
||||||
|
- char *buf, *name, *value;
|
||||||
|
+ ssize_t list_size, size, value_size = 0;
|
||||||
|
+ char *buf, *name, *value = NULL;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if (!old->d_inode->i_op->getxattr ||
|
||||||
|
@@ -41,23 +41,36 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new)
|
||||||
|
if (!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;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (size > value_size) {
|
||||||
|
+ void *new;
|
||||||
|
+ new = krealloc(value, size, GFP_KERNEL);
|
||||||
|
+ if (!new) {
|
||||||
|
+ error = -ENOMEM;
|
||||||
|
+ goto out_free_value;
|
||||||
|
+ }
|
||||||
|
+ value = new;
|
||||||
|
+ value_size = size;
|
||||||
|
+ goto retry;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
error = security_inode_copy_up_xattr(old, new,
|
||||||
|
name, value, &size);
|
||||||
|
if (error < 0)
|
||||||
|
--
|
||||||
|
2.4.6
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user