aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2015-05-04 14:58:57 +0200
committerLorenz Meier <lm@inf.ethz.ch>2015-05-04 14:59:07 +0200
commite09f5d2871f0c23cf8eb8154a2fa8831d9b96062 (patch)
treea375151d332cd0cb510fc5213158853601b106e0 /src
parent980d9bcf3eba96c7e6f4b46039e0484c5e1f3eea (diff)
downloadpx4-firmware-e09f5d2871f0c23cf8eb8154a2fa8831d9b96062.tar.gz
px4-firmware-e09f5d2871f0c23cf8eb8154a2fa8831d9b96062.tar.bz2
px4-firmware-e09f5d2871f0c23cf8eb8154a2fa8831d9b96062.zip
IO driver: Ensure comms protocol cannot get into integer overflow on bad control outputs. Fixes #2119.
Diffstat (limited to 'src')
-rw-r--r--src/drivers/px4io/px4io.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/drivers/px4io/px4io.cpp b/src/drivers/px4io/px4io.cpp
index 9032a9669..b974b711f 100644
--- a/src/drivers/px4io/px4io.cpp
+++ b/src/drivers/px4io/px4io.cpp
@@ -1181,7 +1181,17 @@ PX4IO::io_set_control_state(unsigned group)
}
for (unsigned i = 0; i < _max_controls; i++) {
- regs[i] = FLOAT_TO_REG(controls.control[i]);
+
+ /* ensure FLOAT_TO_REG does not produce an integer overflow */
+ float ctrl = controls.control[i];
+
+ if (ctrl < -1.0f) {
+ ctrl = -1.0f;
+ } else if (ctrl > 1.0f) {
+ ctrl = 1.0f;
+ }
+
+ regs[i] = FLOAT_TO_REG(ctrl);
}
/* copy values to registers in IO */