FAILED: patch "[PATCH] ACPI: platform-profile: Fix CFI violation when accessing" failed to apply to 6.6-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.6-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]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x dd4f730b557ce701a2cd4f604bf1e57667bd8b6e
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025040804-level-crystal-ca73@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From dd4f730b557ce701a2cd4f604bf1e57667bd8b6e Mon Sep 17 00:00:00 2001
From: Nathan Chancellor <[email protected]>
Date: Mon, 10 Feb 2025 21:28:25 -0500
Subject: [PATCH] ACPI: platform-profile: Fix CFI violation when accessing
sysfs files
When an attribute group is created with sysfs_create_group(), the ->sysfs_ops() callback is set to kobj_sysfs_ops, which sets the ->show() and ->store() callbacks to kobj_attr_show() and kobj_attr_store() respectively. These functions use container_of() to get the respective callback from the passed attribute, meaning that these callbacks need to be of the same type as the callbacks in 'struct kobj_attribute'.
However, ->show() and ->store() in the platform_profile driver are defined for struct device_attribute with the help of DEVICE_ATTR_RO() and DEVICE_ATTR_RW(), which results in a CFI violation when accessing platform_profile or platform_profile_choices under /sys/firmware/acpi because the types do not match:
CFI failure at kobj_attr_show+0x19/0x30 (target: platform_profile_choices_show+0x0/0x140; expected type: 0x7a69590c)
There is no functional issue from the type mismatch because the layout of 'struct kobj_attribute' and 'struct device_attribute' are the same, so the container_of() cast does not break anything aside from CFI.
Change the type of platform_profile_choices_show() and platform_profile_{show,store}() to match the callbacks in 'struct kobj_attribute' and update the attribute variables to match, which resolves the CFI violation.
drivers/acpi/platform_profile.c +13 -13
@@ -260,14 +260,14 @@ static int _aggregate_choices(struct device *dev, void *data)/** * platform_profile_choices_show - Show the available profile choices for legacy sysfs interface -* @dev: The device +* @kobj: The kobject * @attr: The attribute * @buf: The buffer to write to * * Return: The number of bytes written */ -static ssize_t platform_profile_choices_show (struct device *dev, -struct device_attribute *attr, +static ssize_t platform_profile_choices_show (struct kobject *kobj, +struct kobj_attribute *attr,char *buf) {unsigned long aggregate[BITS_TO_LONGS (PLATFORM_PROFILE_LAST )];
@@ -333,14 +333,14 @@ static int _store_and_notify(struct device *dev, void *data)/** * platform_profile_show - Show the current profile for legacy sysfs interface -* @dev: The device +* @kobj: The kobject * @attr: The attribute * @buf: The buffer to write to * * Return: The number of bytes written */ -static ssize_t platform_profile_show (struct device *dev, -struct device_attribute *attr, +static ssize_t platform_profile_show (struct kobject *kobj, +struct kobj_attribute *attr,char *buf) {enum platform_profile_option profile =PLATFORM_PROFILE_LAST ;
@@ -362,15 +362,15 @@ static ssize_t platform_profile_show(struct device *dev,/** * platform_profile_store - Set the profile for legacy sysfs interface -* @dev: The device +* @kobj: The kobject * @attr: The attribute * @buf: The buffer to read from * @count: The number of bytes to read * * Return: The number of bytes read */ -static ssize_t platform_profile_store (struct device *dev, -struct device_attribute *attr, +static ssize_t platform_profile_store (struct kobject *kobj, +struct kobj_attribute *attr,const char *buf,size_t count) {unsigned long choices[BITS_TO_LONGS (PLATFORM_PROFILE_LAST )];
@@ -401,12 +401,12 @@ static ssize_t platform_profile_store(struct device *dev,return count; } -static DEVICE_ATTR_RO (platform_profile_choices); -static DEVICE_ATTR_RW (platform_profile); +static struct kobj_attribute attr_platform_profile_choices =__ATTR_RO (platform_profile_choices); +static struct kobj_attribute attr_platform_profile =__ATTR_RW (platform_profile);static struct attribute *platform_profile_attrs[] = { - &dev_attr_platform_profile_choices.attr, - &dev_attr_platform_profile.attr, + &attr_platform_profile_choices.attr, + &attr_platform_profile.attr,NULL };