FAILED: patch "[PATCH] fs/kernel_read_file: Remove FIRMWARE_PREALLOC_BUFFER enum" failed to apply to 5.4-stable tree
Subsystems (8)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c307459b9d1fcb8bbf3ea5a4162979532322ef77 Mon Sep 17 00:00:00 2001
From: Kees Cook <[email protected]>
Date: Fri, 2 Oct 2020 10:38:13 -0700
Subject: [PATCH] fs/kernel_read_file: Remove FIRMWARE_PREALLOC_BUFFER enum
FIRMWARE_PREALLOC_BUFFER is a "how", not a "what", and confuses the LSMs that are interested in filtering between types of things. The "how" should be an internal detail made uninteresting to the LSMs.
Fixes a098ecd2fa7d ("firmware: support loading into a pre-allocated buffer")
Fixes fd90bc559bfb ("ima: based on policy verify firmware signatures (pre-allocated buffer)")
Fixes 4f0496d8ffa3 ("ima: based on policy warn about loading firmware (pre-allocated buffer)")
Signed-off-by Kees Cook <[email protected]>
Reviewed-by Mimi Zohar <[email protected]>
Reviewed-by Luis Chamberlain <[email protected]>
Acked-by Scott Branden <[email protected]>
Signed-off-by Greg Kroah-Hartman <[email protected]>
drivers/base/firmware_loader/main.c +2 -3
@@ -470,14 +470,12 @@ fw_get_filesystem_firmware(struct device *device, struct fw_priv *fw_priv,int i, len;int rc = -ENOENT ;char *path; -enum kernel_read_file_id id =READING_FIRMWARE ;size_t msize =INT_MAX ;void *buffer =NULL ;/* Already populated data member means we're loading into a buffer */ if (!decompress && fw_priv->data) { buffer = fw_priv->data; - id =READING_FIRMWARE_PREALLOC_BUFFER ; msize = fw_priv->allocated_size; }
@@ -501,7 +499,8 @@ fw_get_filesystem_firmware(struct device *device, struct fw_priv *fw_priv,/* load firmware files from the mount namespace of init */ rc =kernel_read_file_from_path_initns (path, &buffer, - &size, msize, id); + &size, msize, +READING_FIRMWARE );if (rc) {if (rc != -ENOENT ) dev_warn(device, "loading %s failed with error %d\n",
fs/exec.c +4 -3
@@ -954,6 +954,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, {loff_t i_size, pos;ssize_t bytes =0 ; +void *allocated =NULL ;int ret;if (!S_ISREG (file_inode (file)->i_mode) || max_size <0 )
@@ -977,8 +978,8 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, goto out; } -if (id !=READING_FIRMWARE_PREALLOC_BUFFER ) - *buf =vmalloc (i_size); +if (!*buf) + *buf = allocated =vmalloc (i_size);if (!*buf) { ret = -ENOMEM ; goto out;
@@ -1007,7 +1008,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, out_free:if (ret <0 ) { -if (id !=READING_FIRMWARE_PREALLOC_BUFFER ) { +if (allocated) {vfree (*buf); *buf =NULL ; }
include/linux/fs.h +1 -1
@@ -2858,10 +2858,10 @@ static inline void i_readcount_inc(struct inode *inode)#endif extern int do_pipe_flags (int *,int ); +/* This is a list of *what* is being read, not *how*. */ #define __kernel_read_file_id (id) \ id(UNKNOWN, unknown) \ id(FIRMWARE, firmware) \ - id(FIRMWARE_PREALLOC_BUFFER, firmware) \ id(FIRMWARE_EFI_EMBEDDED, firmware) \ id(MODULE, kernel-module) \ id(KEXEC_IMAGE, kexec-image) \
kernel/module.c +1 -1
@@ -4035,7 +4035,7 @@ SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags) {struct load_info info = { };loff_t size; -void *hdr; +void *hdr =NULL ;int err; err =may_init_module ();
security/integrity/digsig.c +1 -1
@@ -169,7 +169,7 @@ int __init integrity_add_key(const unsigned int id, const void *data,int __init integrity_load_x509 (const unsigned int id,const char *path) { -void *data; +void *data =NULL ;loff_t size;int rc;key_perm_t perm;
security/integrity/ima/ima_fs.c +1 -1
@@ -272,7 +272,7 @@ static const struct file_operations ima_ascii_measurements_ops = {static ssize_t ima_read_policy (char *path) { -void *data; +void *data =NULL ;char *datap;loff_t size;int rc, pathlen =strlen (path);
security/integrity/ima/ima_main.c +2 -4
@@ -611,19 +611,17 @@ void ima_post_path_mknod(struct dentry *dentry)int ima_read_file (struct file *file,enum kernel_read_file_id read_id) {/* -* READING_FIRMWARE_PREALLOC_BUFFER -* * Do devices using pre-allocated memory run the risk of the * firmware being accessible to the device prior to the completion * of IMA's signature verification any more than when using two -* buffers? +* buffers? It may be desirable to include the buffer address +* in this API and walk all the dma_map_single() mappings to check. */ return 0 ; }const int read_idmap[READING_MAX_ID ] = { [READING_FIRMWARE ] =FIRMWARE_CHECK , - [READING_FIRMWARE_PREALLOC_BUFFER ] =FIRMWARE_CHECK , [READING_MODULE ] =MODULE_CHECK , [READING_KEXEC_IMAGE ] =KEXEC_KERNEL_CHECK , [READING_KEXEC_INITRAMFS ] =KEXEC_INITRAMFS_CHECK ,