Skip to content

platform/x86: intel-uncore-freq: Fix types in sysfs callbacks

David Arcari requested to merge darcari/centos-stream-9:23310 into main

JIRA: https://issues.redhat.com/browse/RHEL-23310
Tested: https://issues.redhat.com/browse/RHEL-23310?focusedId=24043028&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-24043028

commit 416de0246f35f43d871a57939671fe814f4455ee
Author: Nathan Chancellor nathan@kernel.org
Date: Thu Jan 4 15:59:03 2024 -0700

platform/x86: intel-uncore-freq: Fix types in sysfs callbacks  

When booting a kernel with CONFIG_CFI_CLANG, there is a CFI failure when  
accessing any of the values under  
/sys/devices/system/cpu/intel_uncore_frequency/package_00_die_00:  

  $ cat /sys/devices/system/cpu/intel_uncore_frequency/package_00_die_00/max_freq_khz  
  fish: Job 1, 'cat /sys/devices/system/cpu/int…' terminated by signal SIGSEGV (Address boundary error)  

  $ sudo dmesg &| grep 'CFI failure'  
  [  170.953925] CFI failure at kobj_attr_show+0x19/0x30 (target: show_max_freq_khz+0x0/0xc0 [intel_uncore_frequency_common]; expected type: 0xd34078c5  

The sysfs callback functions such as show_domain_id() are written as if  
they are going to be called by dev_attr_show() but as the above message  
shows, they are instead called by kobj_attr_show(). kCFI checks that the  
destination of an indirect jump has the exact same type as the prototype  
of the function pointer it is called through and fails when they do not.  

These callbacks are called through kobj_attr_show() because  
uncore_root_kobj was initialized with kobject_create_and_add(), which  
means uncore_root_kobj has a ->sysfs_ops of kobj_sysfs_ops from  
kobject_create(), which uses kobj_attr_show() as its ->show() value.  

The only reason there has not been a more noticeable problem until this  
point is that 'struct kobj_attribute' and 'struct device_attribute' have  
the same layout, so getting the callback from container_of() works the  
same with either value.  

Change all the callbacks and their uses to be compatible with  
kobj_attr_show() and kobj_attr_store(), which resolves the kCFI failure  
and allows the sysfs files to work properly.  

Closes: https://github.com/ClangBuiltLinux/linux/issues/1974  
Fixes: ae7b2ce57851 ("platform/x86/intel/uncore-freq: Use sysfs API to create attributes")  
Cc: stable@vger.kernel.org  
Signed-off-by: Nathan Chancellor <nathan@kernel.org>  
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>  
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>  
Link: https://lore.kernel.org/r/20240104-intel-uncore-freq-kcfi-fix-v1-1-bf1e8939af40@kernel.org  
Signed-off-by: Hans de Goede <hdegoede@redhat.com>  

Signed-off-by: David Arcari darcari@redhat.com

Edited by David Arcari

Merge request reports