From: "Mark Pearson" <mpearson-lenovo@squebb.ca>
To: "Nathan Chancellor" <nathan@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Len Brown" <lenb@kernel.org>
Cc: "Hans de Goede" <hdegoede@redhat.com>,
"Limonciello, Mario" <mario.limonciello@amd.com>,
"Kees Cook" <kees@kernel.org>,
"Sami Tolvanen" <samitolvanen@google.com>,
"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
linux-kernel@vger.kernel.org, llvm@lists.linux.dev,
patches@lists.linux.dev, stable@vger.kernel.org,
"John Rowley" <lkml@johnrowley.me>
Subject: Re: [PATCH v3] ACPI: platform-profile: Fix CFI violation when accessing sysfs files
Date: Tue, 11 Feb 2025 12:41:25 -0500 [thread overview]
Message-ID: <f9bae655-2835-4623-b18e-1d370dd220d5@app.fastmail.com> (raw)
In-Reply-To: <52c49252-7a81-4d27-a8a9-b2f1e5f837df@app.fastmail.com>
On Tue, Feb 11, 2025, at 10:05 AM, Mark Pearson wrote:
> Hi Nathan
>
> On Mon, Feb 10, 2025, at 9:28 PM, Nathan Chancellor 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)
>>
>> 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.
>>
>> Cc: stable@vger.kernel.org
>> Fixes: a2ff95e018f1 ("ACPI: platform: Add platform profile support")
>> Reported-by: John Rowley <lkml@johnrowley.me>
>> Closes: https://github.com/ClangBuiltLinux/linux/issues/2047
>> Tested-by: John Rowley <lkml@johnrowley.me>
>> Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
>> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
>> ---
>> Changes in v3:
>> - Rebase on 6.14-rc1, which includes updates to the driver to address
>> Greg's previous concerns but this change is still needed for the
>> legacy sysfs interface. v2 can be used for the stable backport.
>> - Link to v2:
>> https://lore.kernel.org/r/20241118-acpi-platform_profile-fix-cfi-violation-v2-1-62ff952804de@kernel.org
>>
>> Changes in v2:
>> - Rebase on linux-pm/acpi
>> - Pick up Sami's reviewed-by tag
>> - Adjust wording around why there is no functional issue from the
>> mismatched types
>> - Link to v1:
>> https://lore.kernel.org/r/20240819-acpi-platform_profile-fix-cfi-violation-v1-1-479365d848f6@kernel.org
>> ---
>> drivers/acpi/platform_profile.c | 26 +++++++++++++-------------
>> 1 file changed, 13 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/acpi/platform_profile.c
>> b/drivers/acpi/platform_profile.c
>> index fc92e43d0fe9..1b6317f759f9 100644
>> --- a/drivers/acpi/platform_profile.c
>> +++ b/drivers/acpi/platform_profile.c
>> @@ -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
>> };
>>
>>
>> ---
>> base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
>> change-id: 20240819-acpi-platform_profile-fix-cfi-violation-de278753bd5f
>>
>> Best regards,
>> --
>> Nathan Chancellor <nathan@kernel.org>
>
> Just a note to say thank you for noticing my email address change - the
> old lenovo one was awful to use so I dropped it a while back, but it
> meant I missed your first two patches (my mail filters for the list
> should have caught it and I'll have to figure out why not...)
>
> From the V1 patch there was a question about why it was done this way:
> I believe I just copied how it seems to be done everywhere else in the
> kernel. I can't remember what I used as a reference exactly, but I went
> and checked a few random drivers and it seems to be everywhere.
>
> Patch looks fine (I'd like to try it out on my system - will aim to do
> that today). I didn't know what CFI was (and have lightly educated
> myself now).
> Is there a better way to fix this so it's common across all drivers
> somehow? Updating every individual instance is going to be a lot.
>
> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
>
Also:
Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Mark
next prev parent reply other threads:[~2025-02-11 17:41 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-11 2:28 [PATCH v3] ACPI: platform-profile: Fix CFI violation when accessing sysfs files Nathan Chancellor
2025-02-11 6:27 ` Greg KH
2025-02-11 15:05 ` Mark Pearson
2025-02-11 17:41 ` Mark Pearson [this message]
2025-02-11 19:14 ` Nathan Chancellor
2025-02-18 18:00 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f9bae655-2835-4623-b18e-1d370dd220d5@app.fastmail.com \
--to=mpearson-lenovo@squebb.ca \
--cc=hdegoede@redhat.com \
--cc=kees@kernel.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lkml@johnrowley.me \
--cc=llvm@lists.linux.dev \
--cc=mario.limonciello@amd.com \
--cc=nathan@kernel.org \
--cc=patches@lists.linux.dev \
--cc=rafael@kernel.org \
--cc=samitolvanen@google.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.