Commit 2e98b1fd authored by Henrik Brix Andersen's avatar Henrik Brix Andersen Committed by Chris Friedt
Browse files

drivers: can: be consistent in filter_id checks when removing rx filters

Change the CAN controller driver implementations for the
can_remove_rx_filter() API call to be consistent in their
validation of the supplied filter_id.

Fixes: #64398

Signed-off-by: default avatarHenrik Brix Andersen <hebad@vestas.com>
parent 13072b4c
Loading
Loading
Loading
Loading
+5 −0
Changes for drivers/can/can_loopback.c: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -171,6 +171,11 @@ void can_loopback_detach(const struct device *dev, int filter_id)
{
	struct can_loopback_data *data = DEV_DATA(dev);

	if (filter_id < 0 || filter_id >= ARRAY_SIZE(data->filters)) {
		LOG_ERR("filter ID %d out of bounds", filter_id);
		return;
	}

	LOG_DBG("Detach filter ID: %d", filter_id);
	k_mutex_lock(&data->mtx, K_FOREVER);
	data->filters[filter_id].rx_cb = NULL;
+6 −1
Changes for drivers/can/can_mcan.c: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -894,11 +894,16 @@ int can_mcan_attach_isr(struct can_mcan_data *data,
void can_mcan_detach(struct can_mcan_data *data,
		     struct can_mcan_msg_sram *msg_ram, int filter_nr)
{
	if (filter_nr < 0) {
		LOG_ERR("filter ID %d out of bounds", filter_nr);
		return;
	}

	k_mutex_lock(&data->inst_mutex, K_FOREVER);
	if (filter_nr >= NUM_STD_FILTER_DATA) {
		filter_nr -= NUM_STD_FILTER_DATA;
		if (filter_nr >= NUM_STD_FILTER_DATA) {
			LOG_ERR("Wrong filter id");
			LOG_ERR("filter ID %d out of bounds", filter_nr);
			return;
		}

+5 −0
Changes for drivers/can/can_mcp2515.c: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -551,6 +551,11 @@ static void mcp2515_detach(const struct device *dev, int filter_nr)
{
	struct mcp2515_data *dev_data = DEV_DATA(dev);

	if (filter_nr < 0 || filter_nr >= CONFIG_CAN_MAX_FILTER) {
		LOG_ERR("filter ID %d out of bounds", filter_nr);
		return;
	}

	k_mutex_lock(&dev_data->mutex, K_FOREVER);
	dev_data->filter_usage &= ~BIT(filter_nr);
	k_mutex_unlock(&dev_data->mutex);
+2 −3
Changes for drivers/can/can_mcux_flexcan.c: 2 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -480,9 +480,8 @@ static void mcux_flexcan_detach(const struct device *dev, int filter_id)
	const struct mcux_flexcan_config *config = dev->config;
	struct mcux_flexcan_data *data = dev->data;

	if (filter_id >= MCUX_FLEXCAN_MAX_RX) {
		LOG_ERR("Detach: Filter id >= MAX_RX (%d >= %d)", filter_id,
			MCUX_FLEXCAN_MAX_RX);
	if (filter_id < 0 || filter_id >= MCUX_FLEXCAN_MAX_RX) {
		LOG_ERR("filter ID %d out of bounds", filter_id);
		return;
	}

+2 −1
Changes for drivers/can/can_rcar.c: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -829,7 +829,8 @@ void can_rcar_detach(const struct device *dev, int filter_nr)
{
	struct can_rcar_data *data = DEV_CAN_DATA(dev);

	if (filter_nr >= CONFIG_CAN_RCAR_MAX_FILTER) {
	if (filter_nr < 0 || filter_nr >= CONFIG_CAN_RCAR_MAX_FILTER) {
		LOG_ERR("filter ID %d out of bounds", filter_nr);
		return;
	}