Hi Nathan, On Mon, Aug 19, 2024 at 12:09 PM Nathan Chancellor <nathan@xxxxxxxxxx> wrote: > > 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 the same type as the callbacks in 'struct kobj_attribute'. > > However, the platform_profile sysfs functions have the type of the > ->show() and ->store() callbacks in 'struct device_attribute', which > results 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) > > This happens to work because the layout of 'struct kobj_attribute' and > 'struct device_attribute' are the same, so the container_of() cast > happens to allow the callbacks to still work. > > 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. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: a2ff95e018f1 ("ACPI: platform: Add platform profile support") > Reported-by: John Rowley <lkml@xxxxxxxxxxxxx> > Closes: https://github.com/ClangBuiltLinux/linux/issues/2047 > Tested-by: John Rowley <lkml@xxxxxxxxxxxxx> > Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx> > --- > drivers/acpi/platform_profile.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) Looks good to me, thanks for fixing this! Reviewed-by: Sami Tolvanen <samitolvanen@xxxxxxxxxx> Sami