From: David Stevens <stevensd@xxxxxxxxxxxx> Add a moduleparam that can be set to bypass the check that limits users without CAP_SYS_ADMIN to only being able to read the first 64 bytes of the config space. This allows systems without problematic hardware to be configured to allow users without CAP_SYS_ADMIN to read PCI capabilities. Signed-off-by: David Stevens <stevensd@xxxxxxxxxxxx> --- drivers/pci/pci-sysfs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 602f0fb0b007..162423b3c052 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -28,10 +28,17 @@ #include <linux/pm_runtime.h> #include <linux/msi.h> #include <linux/of.h> +#include <linux/moduleparam.h> #include "pci.h" static int sysfs_initialized; /* = 0 */ +static bool allow_unsafe_config_reads; +module_param_named(allow_unsafe_config_reads, + allow_unsafe_config_reads, bool, 0644); +MODULE_PARM_DESC(allow_unsafe_config_reads, + "Enable full read access to config space without CAP_SYS_ADMIN."); + /* show configuration fields */ #define pci_config_attr(field, format_string) \ static ssize_t \ @@ -696,7 +703,8 @@ static ssize_t pci_read_config(struct file *filp, struct kobject *kobj, u8 *data = (u8 *) buf; /* Several chips lock up trying to read undefined config space */ - if (file_ns_capable(filp, &init_user_ns, CAP_SYS_ADMIN)) + if (allow_unsafe_config_reads || + file_ns_capable(filp, &init_user_ns, CAP_SYS_ADMIN)) size = dev->cfg_size; else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) size = 128; -- 2.35.1.1094.g7c7d902a7c-goog