Skip to content

Commit 7240f67

Browse files
committed
TooLong: refuse too long messages.
1 parent b56cea6 commit 7240f67

3 files changed

Lines changed: 23 additions & 3 deletions

File tree

device/src/messenger.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,16 @@ int Messenger_SendMessage(message_t* message) {
443443
connection_id_t connectionId = message->connectionId;
444444
device_id_t dst = message->dst;
445445

446+
uint16_t totalLen = 3 + message->idsUsed + message->len;
447+
if (totalLen > MAX_LINK_PACKET_LENGTH) {
448+
const char *desc1, *desc2;
449+
getMessageDescription(message->messageId[0], message->messageId[1], &desc1, &desc2);
450+
LogU("Refusing to send over-long message (%d > %d bytes) to %s: %s %s\n",
451+
totalLen, MAX_LINK_PACKET_LENGTH, Utils_DeviceIdToString(dst),
452+
desc1 == NULL ? "" : desc1, desc2 == NULL ? "" : desc2);
453+
return -1;
454+
}
455+
446456
int err = 0;
447457

448458
switch (connectionId) {

shared/uart_parser.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ static void appendRxByte(uart_parser_t *uartState, uint8_t byte) {
2323
uartState->rxCrcBuffer[uartState->rxPosition++] = byte;
2424
} else if (uartState->rxPosition - CRC_LEN < uartState->rxLength) {
2525
uartState->rxBuffer[uartState->rxPosition++ - CRC_LEN] = byte;
26-
} else {
27-
LogU("Uart error: too long message [%i, %i, ... %i]\n", uartState->rxPosition, uartState->rxBuffer[0], uartState->rxBuffer[1], byte);
28-
uartState->receiveMessage(uartState, UartControl_Unexpected, NULL, 0);
26+
} else if (!uartState->rxTooLong) {
27+
uartState->rxTooLong = true;
28+
LogU("Uart error: too long message, discarding [len %i: src %i, dst %i, msgId %i, propId %i]\n",
29+
uartState->rxLength, uartState->rxBuffer[0], uartState->rxBuffer[1], uartState->rxBuffer[3], uartState->rxBuffer[4]);
2930
}
3031
}
3132

@@ -95,6 +96,11 @@ static void processIncomingByte(uart_parser_t *uartState, uint8_t byte) {
9596

9697
uartState->receivingMessage = false;
9798

99+
if (uartState->rxTooLong) {
100+
uartState->rxTooLong = false;
101+
break;
102+
}
103+
98104
uint16_t len = uartState->rxPosition;
99105
uint8_t* data = uartState->rxBuffer;
100106

@@ -117,6 +123,7 @@ static void processIncomingByte(uart_parser_t *uartState, uint8_t byte) {
117123
}
118124
uartState->receivingMessage = true;
119125
uartState->rxPosition = 0;
126+
uartState->rxTooLong = false;
120127
break;
121128
msg_byte:
122129
default:
@@ -209,6 +216,7 @@ void UartParser_InitParser(
209216
uartState->txPosition = 0;
210217
uartState->receivingMessage = false;
211218
uartState->escaping = false;
219+
uartState->rxTooLong = false;
212220
uartState->receiveMessage = receiveMessage;
213221
uartState->userArg = userArg;
214222
}
@@ -219,6 +227,7 @@ void UartParser_SetRxBuffer(uart_parser_t *uartState, uint8_t* buffer, uint16_t
219227
uartState->rxLength = length;
220228
uartState->escaping = false;
221229
uartState->receivingMessage = false;
230+
uartState->rxTooLong = false;
222231
}
223232

224233
void UartParser_SetTxBuffer(uart_parser_t *uartState, uint8_t* buffer, uint16_t length) {

shared/uart_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
bool escaping;
4949
bool receivingMessage;
50+
bool rxTooLong;
5051

5152
} uart_parser_t;
5253

0 commit comments

Comments
 (0)