hwmon: Ensure that 'dev' passed to hwmon_notify_event() is a hwmon device

The device parameter of hwmon_notify_event() must be a hardware monitoring
device. Since this is easy to get wrong, and since passing a non-hwmon
device may result in a crash, generate a warning traceback and abort if
a wrong device class is passed as parameter.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Guenter Roeck 2026-08-20 22:19:13 -07:00
parent 8afc94bfb0
commit 2bf98a6af1

View File

@ -318,6 +318,11 @@ static int hwmon_attr_base(enum hwmon_sensor_types type)
return 1;
}
static bool is_hwmon_device(struct device *dev)
{
return dev->class == &hwmon_class;
}
#if IS_REACHABLE(CONFIG_I2C)
/*
@ -338,7 +343,7 @@ static int hwmon_attr_base(enum hwmon_sensor_types type)
static int hwmon_match_device(struct device *dev, const void *data)
{
return dev->class == &hwmon_class;
return is_hwmon_device(dev);
}
static ssize_t pec_show(struct device *dev, const struct device_attribute *dummy,
@ -781,6 +786,9 @@ int hwmon_notify_event(struct device *dev, enum hwmon_sensor_types type,
const char *template;
int base;
if (WARN(!is_hwmon_device(dev), "%s is not a hardware monitoring device\n",
dev_name(dev)))
return -EINVAL;
if (type >= ARRAY_SIZE(__templates))
return -EINVAL;
if (attr >= __templates_size[type])