Commit eb37b862 authored by Yong Cong Sin's avatar Yong Cong Sin Committed by Anas Nashif
Browse files

sensor_shell: fix hang when device is not a sensor



If `CONFIG_SENSOR_INFO` is enabled, use the `sensor_info`
section to validate that the argument is a sensor before using,
otherwise the shell command will hang the application.

Signed-off-by: default avatarYong Cong Sin <ycsin@meta.com>
parent e879cd05
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -144,6 +144,20 @@ static struct sample_stats sensor_stats[CONFIG_SENSOR_SHELL_MAX_TRIGGER_DEVICES]

static const struct device *sensor_trigger_devices[CONFIG_SENSOR_SHELL_MAX_TRIGGER_DEVICES];

static bool device_is_sensor(const struct device *dev)
{
#ifdef CONFIG_SENSOR_INFO
	STRUCT_SECTION_FOREACH(sensor_info, sensor) {
		if (sensor->dev == dev) {
			return true;
		}
	}
	return false;
#else
	return true;
#endif /* CONFIG_SENSOR_INFO */
}

static int find_sensor_trigger_device(const struct device *sensor)
{
	for (int i = 0; i < CONFIG_SENSOR_SHELL_MAX_TRIGGER_DEVICES; i++) {
@@ -529,6 +543,12 @@ static int cmd_get_sensor(const struct shell *sh, size_t argc, char *argv[])
		return -ENODEV;
	}

	if (!device_is_sensor(dev)) {
		shell_error(sh, "Device is not a sensor (%s)", argv[1]);
		k_mutex_unlock(&cmd_get_mutex);
		return -ENODEV;
	}

	if (argc == 2) {
		/* read all channel types */
		for (int i = 0; i < ARRAY_SIZE(iodev_sensor_shell_channels); ++i) {
@@ -591,6 +611,12 @@ static int cmd_sensor_attr_set(const struct shell *shell_ptr, size_t argc, char
		return -ENODEV;
	}

	if (!device_is_sensor(dev)) {
		shell_error(shell_ptr, "Device is not a sensor (%s)", argv[1]);
		k_mutex_unlock(&cmd_get_mutex);
		return -ENODEV;
	}

	for (size_t i = 2; i < argc; i += 3) {
		int channel = parse_named_int(argv[i], sensor_channel_name,
					      ARRAY_SIZE(sensor_channel_name));
@@ -669,6 +695,12 @@ static int cmd_sensor_attr_get(const struct shell *shell_ptr, size_t argc, char
		return -ENODEV;
	}

	if (!device_is_sensor(dev)) {
		shell_error(shell_ptr, "Device is not a sensor (%s)", argv[1]);
		k_mutex_unlock(&cmd_get_mutex);
		return -ENODEV;
	}

	if (argc > 2) {
		for (size_t i = 2; i < argc; i += 2) {
			cmd_sensor_attr_get_handler(shell_ptr, dev, argv[i], argv[i + 1],