From 37860f05cb3e4aa55cf7f0d67968b1bcf579e6c3 Mon Sep 17 00:00:00 2001 From: Will Gauvin Date: Sat, 28 May 2022 21:14:23 +1000 Subject: [PATCH] Ensure defensive check of UBP previous data to fix crash - fixes #1662 (#1663) --- drivers/auxiliary/pegasus_upb.cpp | 27 +++++++++++++++++++++------ drivers/auxiliary/pegasus_upb.h | 11 +++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/auxiliary/pegasus_upb.cpp b/drivers/auxiliary/pegasus_upb.cpp index 7ea3410ff9..1de3878d69 100644 --- a/drivers/auxiliary/pegasus_upb.cpp +++ b/drivers/auxiliary/pegasus_upb.cpp @@ -1341,13 +1341,28 @@ bool PegasusUPB::sendFirmware() ////////////////////////////////////////////////////////////////////// bool PegasusUPB::sensorUpdated(const std::vector &result, uint8_t start, uint8_t end) { - for (uint8_t index = start; index <= end; index++) - if (result[index] != lastSensorData[index]) + if (lastSensorData.empty()) + return true; + + for (uint8_t index = start; index <= end; index++){ + if (index >= lastSensorData.size() or result[index] != lastSensorData[index]) return true; + } return false; } +////////////////////////////////////////////////////////////////////// +/// +////////////////////////////////////////////////////////////////////// +bool PegasusUPB::stepperUpdated(const std::vector &result, u_int8_t index) +{ + if (lastStepperData.empty()) + return true; + + return index >= lastStepperData.size() or result[index] != lastSensorData[index]; +} + ////////////////////////////////////////////////////////////////////// /// ////////////////////////////////////////////////////////////////////// @@ -1641,13 +1656,13 @@ bool PegasusUPB::getStepperData() IDSetNumber(&FocusAbsPosNP, nullptr); IDSetNumber(&FocusRelPosNP, nullptr); } - else if (result[0] != lastStepperData[0]) + else if (stepperUpdated(result, 0)) IDSetNumber(&FocusAbsPosNP, nullptr); FocusReverseS[INDI_ENABLED].s = (std::stoi(result[2]) == 1) ? ISS_ON : ISS_OFF; FocusReverseS[INDI_DISABLED].s = (std::stoi(result[2]) == 1) ? ISS_OFF : ISS_ON; - if (result[2] != lastStepperData[2]) + if (stepperUpdated(result, 1)) IDSetSwitch(&FocusReverseSP, nullptr); uint16_t backlash = std::stoi(result[3]); @@ -1656,7 +1671,7 @@ bool PegasusUPB::getStepperData() FocusBacklashN[0].value = backlash; FocusBacklashS[INDI_ENABLED].s = ISS_OFF; FocusBacklashS[INDI_DISABLED].s = ISS_ON; - if (result[3] != lastStepperData[3]) + if (stepperUpdated(result, 3)) { IDSetSwitch(&FocusBacklashSP, nullptr); IDSetNumber(&FocuserSettingsNP, nullptr); @@ -1667,7 +1682,7 @@ bool PegasusUPB::getStepperData() FocusBacklashS[INDI_ENABLED].s = ISS_ON; FocusBacklashS[INDI_DISABLED].s = ISS_OFF; FocusBacklashN[0].value = backlash; - if (result[3] != lastStepperData[3]) + if (stepperUpdated(result, 3)) { IDSetSwitch(&FocusBacklashSP, nullptr); IDSetNumber(&FocuserSettingsNP, nullptr); diff --git a/drivers/auxiliary/pegasus_upb.h b/drivers/auxiliary/pegasus_upb.h index a88a2b63ac..47546f7453 100644 --- a/drivers/auxiliary/pegasus_upb.h +++ b/drivers/auxiliary/pegasus_upb.h @@ -129,9 +129,20 @@ class PegasusUPB : public INDI::DefaultDevice, public INDI::FocuserInterface, pu /** * @return Return true if sensor data different from last data + * + * If the previous sensor data is empty then this will always + * return true. */ bool sensorUpdated(const std::vector &result, uint8_t start, uint8_t end); + /** + * @return Return true if stepper data different from last data. + * + * If the previous stepper data is empty then this will always + * return true. + */ + bool stepperUpdated(const std::vector &result, u_int8_t index); + int PortFD { -1 }; bool setupComplete { false };