Skip to content

Commit 4c9b507

Browse files
nathanchancegregkh
authored andcommitted
nilfs2: fix CFI failure when accessing /sys/fs/nilfs2/features/*
commit 025e87f upstream. When accessing one of the files under /sys/fs/nilfs2/features when CONFIG_CFI_CLANG is enabled, there is a CFI violation: CFI failure at kobj_attr_show+0x59/0x80 (target: nilfs_feature_revision_show+0x0/0x30; expected type: 0xfc392c4d) ... Call Trace: <TASK> sysfs_kf_seq_show+0x2a6/0x390 ? __cfi_kobj_attr_show+0x10/0x10 kernfs_seq_show+0x104/0x15b seq_read_iter+0x580/0xe2b ... When the kobject of the kset for /sys/fs/nilfs2 is initialized, its ktype is set to kset_ktype, which has a ->sysfs_ops of kobj_sysfs_ops. When nilfs_feature_attr_group is added to that kobject via sysfs_create_group(), the kernfs_ops of each files is sysfs_file_kfops_rw, which will call sysfs_kf_seq_show() when ->seq_show() is called. sysfs_kf_seq_show() in turn calls kobj_attr_show() through ->sysfs_ops->show(). kobj_attr_show() casts the provided attribute out to a 'struct kobj_attribute' via container_of() and calls ->show(), resulting in the CFI violation since neither nilfs_feature_revision_show() nor nilfs_feature_README_show() match the prototype of ->show() in 'struct kobj_attribute'. Resolve the CFI violation by adjusting the second parameter in nilfs_feature_{revision,README}_show() from 'struct attribute' to 'struct kobj_attribute' to match the expected prototype. Link: https://lkml.kernel.org/r/20250906144410.22511-1-konishi.ryusuke@gmail.com Fixes: aebe17f ("nilfs2: add /sys/fs/nilfs2/features group") Signed-off-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com> Reported-by: kernel test robot <oliver.sang@intel.com> Closes: https://lore.kernel.org/oe-lkp/202509021646.bc78d9ef-lkp@intel.com/ Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 196a3a7 commit 4c9b507

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

fs/nilfs2/sysfs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,7 @@ void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs)
10751075
************************************************************************/
10761076

10771077
static ssize_t nilfs_feature_revision_show(struct kobject *kobj,
1078-
struct attribute *attr, char *buf)
1078+
struct kobj_attribute *attr, char *buf)
10791079
{
10801080
return sysfs_emit(buf, "%d.%d\n",
10811081
NILFS_CURRENT_REV, NILFS_MINOR_REV);
@@ -1087,7 +1087,7 @@ static const char features_readme_str[] =
10871087
"(1) revision\n\tshow current revision of NILFS file system driver.\n";
10881088

10891089
static ssize_t nilfs_feature_README_show(struct kobject *kobj,
1090-
struct attribute *attr,
1090+
struct kobj_attribute *attr,
10911091
char *buf)
10921092
{
10931093
return sysfs_emit(buf, features_readme_str);

fs/nilfs2/sysfs.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ struct nilfs_sysfs_dev_subgroups {
5050
struct completion sg_segments_kobj_unregister;
5151
};
5252

53-
#define NILFS_COMMON_ATTR_STRUCT(name) \
53+
#define NILFS_KOBJ_ATTR_STRUCT(name) \
5454
struct nilfs_##name##_attr { \
5555
struct attribute attr; \
56-
ssize_t (*show)(struct kobject *, struct attribute *, \
56+
ssize_t (*show)(struct kobject *, struct kobj_attribute *, \
5757
char *); \
58-
ssize_t (*store)(struct kobject *, struct attribute *, \
58+
ssize_t (*store)(struct kobject *, struct kobj_attribute *, \
5959
const char *, size_t); \
6060
}
6161

62-
NILFS_COMMON_ATTR_STRUCT(feature);
62+
NILFS_KOBJ_ATTR_STRUCT(feature);
6363

6464
#define NILFS_DEV_ATTR_STRUCT(name) \
6565
struct nilfs_##name##_attr { \

0 commit comments

Comments
 (0)