diff --git a/src/drivers/uavcan/actuators/servo.cpp b/src/drivers/uavcan/actuators/servo.cpp index fb17a0e268..b59a1f9f49 100644 --- a/src/drivers/uavcan/actuators/servo.cpp +++ b/src/drivers/uavcan/actuators/servo.cpp @@ -35,6 +35,8 @@ #include #include +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + using namespace time_literals; UavcanServoController::UavcanServoController(uavcan::INode &node) : @@ -44,8 +46,20 @@ UavcanServoController::UavcanServoController(uavcan::INode &node) : _uavcan_sub_temperature(node), _uavcan_sub_circuit_status(node) { + /* Ensure that future changes do not cause any out-of-bounds access */ + static_assert(ARRAY_SIZE(_servo_status.servo) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_last_temperature) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_last_temperature_error_flag) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_last_voltage) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_last_current) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_last_power_error_flag) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_servo_temperature_counter) == servo_status_s::CONNECTED_SERVO_MAX); + static_assert(ARRAY_SIZE(_servo_power_counter) == servo_status_s::CONNECTED_SERVO_MAX); + _uavcan_pub_array_cmd.setPriority(UAVCAN_COMMAND_TRANSFER_PRIORITY); - memset(_last_temperature, 0, sizeof(_last_temperature)); // Set bytes to 0 + + /* Init the arrays to zero */ + memset(_last_temperature, 0, sizeof(_last_temperature)); memset(_last_temperature_error_flag, 0, sizeof(_last_temperature_error_flag)); memset(_last_voltage, 0, sizeof(_last_voltage)); memset(_last_current, 0, sizeof(_last_current)); @@ -74,8 +88,7 @@ UavcanServoController::init() } // Servo circuit status subscription - res = _uavcan_sub_circuit_status.start(CircuitStatusCbBinder(this, - &UavcanServoController::servo_circuit_status_sub_cb)); + res = _uavcan_sub_circuit_status.start(CircuitStatusCbBinder(this, &UavcanServoController::servo_circuit_status_sub_cb)); if (res < 0) { PX4_ERR("Servo circuit status sub failed %i", res); diff --git a/src/drivers/uavcan/uavcan_main.cpp b/src/drivers/uavcan/uavcan_main.cpp index 5848715248..fa7d03e864 100644 --- a/src/drivers/uavcan/uavcan_main.cpp +++ b/src/drivers/uavcan/uavcan_main.cpp @@ -1156,7 +1156,6 @@ void UavcanMixingInterfaceServo::mixerChanged() if (i < servo_status_s::CONNECTED_SERVO_MAX) { _servo_controller.servo_status().servo[i].servo_function = (uint8_t)_mixing_output.outputFunction(i); } - } _servo_controller.set_servo_count(servo_count);