1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-18 03:52:11 +01:00

OP-1841 - Check available size at each step to avoid overrun

This commit is contained in:
Alessio Morale 2015-04-20 05:48:39 +02:00
parent 77dfff1dac
commit 3128127392

View File

@ -376,49 +376,48 @@ UAVTalkRxState UAVTalkProcessInputStreamQuiet(UAVTalkConnection connectionHandle
} }
uint8_t processedBytes = (*position); uint8_t processedBytes = (*position);
uint8_t count = 0;
// stop processing as soon as a complete packet is received, error is encountered or buffer is processed entirely // stop processing as soon as a complete packet is received, error is encountered or buffer is processed entirely
while ((count = length - (*position)) > 0 while ((length > (*position))
&& iproc->state != UAVTALK_STATE_COMPLETE && iproc->state != UAVTALK_STATE_COMPLETE
&& iproc->state != UAVTALK_STATE_ERROR) { && iproc->state != UAVTALK_STATE_ERROR) {
// Receive state machine // Receive state machine
if (iproc->state == UAVTALK_STATE_SYNC && if ((length > (*position)) && iproc->state == UAVTALK_STATE_SYNC &&
!UAVTalkProcess_SYNC(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_SYNC(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_TYPE && if ((length > (*position)) && iproc->state == UAVTALK_STATE_TYPE &&
!UAVTalkProcess_TYPE(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_TYPE(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_SIZE && if ((length > (*position)) && iproc->state == UAVTALK_STATE_SIZE &&
!UAVTalkProcess_SIZE(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_SIZE(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_OBJID && if ((length > (*position)) && iproc->state == UAVTALK_STATE_OBJID &&
!UAVTalkProcess_OBJID(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_OBJID(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_INSTID && if ((length > (*position)) && iproc->state == UAVTALK_STATE_INSTID &&
!UAVTalkProcess_INSTID(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_INSTID(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_TIMESTAMP && if ((length > (*position)) && iproc->state == UAVTALK_STATE_TIMESTAMP &&
!UAVTalkProcess_TIMESTAMP(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_TIMESTAMP(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_DATA && if ((length > (*position)) && iproc->state == UAVTALK_STATE_DATA &&
!UAVTalkProcess_DATA(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_DATA(connection, iproc, rxbuffer, length, position)) {
break; break;
} }
if (iproc->state == UAVTALK_STATE_CS && if ((length > (*position)) && iproc->state == UAVTALK_STATE_CS &&
!UAVTalkProcess_CS(connection, iproc, rxbuffer, length, position)) { !UAVTalkProcess_CS(connection, iproc, rxbuffer, length, position)) {
break; break;
} }