Skip to content

Commit b7e2be5

Browse files
a1ienp.kuskov
andauthored
Fix crush single message inside long message (#190)
* Add test for single message inside long message * Fix crush single message inside long message Co-authored-by: p.kuskov <[email protected]>
1 parent c9e482e commit b7e2be5

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

canard.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,12 @@ int16_t canardHandleRxFrame(CanardInstance* ins, const CanardCANFrame* frame, ui
319319
const bool first_frame = IS_START_OF_TRANSFER(tail_byte);
320320
const bool not_previous_tid =
321321
computeTransferIDForwardDistance((uint8_t) rx_state->transfer_id, TRANSFER_ID_FROM_TAIL_BYTE(tail_byte)) > 1;
322+
const bool incomplete_frame = rx_state->buffer_blocks != NULL;
322323

323324
const bool need_restart =
324325
(not_initialized) ||
325326
(tid_timed_out) ||
326-
(first_frame && not_previous_tid);
327+
(first_frame && (not_previous_tid || incomplete_frame));
327328

328329
if (need_restart)
329330
{

tests/test_rxerr.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,3 +372,37 @@ TEST_CASE("canardHandleRxFrame OOM handling, Correctness")
372372
err = canardHandleRxFrame(&canard, &frame, 1);
373373
REQUIRE(-CANARD_ERROR_OUT_OF_MEMORY == err);
374374
}
375+
376+
TEST_CASE("canardHandleRxFrame unusual single frame, Correctness")
377+
{
378+
uint8_t canard_memory_pool[1024];
379+
CanardInstance canard;
380+
CanardCANFrame frame;
381+
int16_t err;
382+
383+
g_should_accept = true;
384+
385+
//Open canard to accept all transfers with a node ID of 20
386+
canardInit(&canard, canard_memory_pool, sizeof(canard_memory_pool),
387+
onTransferReceived, shouldAcceptTransfer, &canard);
388+
canardSetLocalNodeID(&canard, 20);
389+
390+
frame.data[7] = CONSTRUCT_TAIL_BYTE(1, 0, 0, 1);
391+
frame.id = CONSTRUCT_SVC_ID(0, 0, 1, 20, 0);
392+
frame.data_len = 8; //Data length MUST be full packet
393+
err = canardHandleRxFrame(&canard, &frame, 1);
394+
REQUIRE(CANARD_OK == err);
395+
396+
397+
frame.data[7] = CONSTRUCT_TAIL_BYTE(0, 0, 1, 1);
398+
frame.id = CONSTRUCT_SVC_ID(0, 0, 1, 20, 0);
399+
frame.data_len = 8; //Data length MUST be full packet
400+
err = canardHandleRxFrame(&canard, &frame, 1);
401+
REQUIRE(CANARD_OK == err);
402+
403+
frame.data[1] = CONSTRUCT_TAIL_BYTE(1, 1, 1, 1);
404+
frame.id = CONSTRUCT_SVC_ID(0, 0, 1, 20, 0);
405+
frame.data_len = 2; //Data length MUST be full packet
406+
err = canardHandleRxFrame(&canard, &frame, 1);
407+
REQUIRE(CANARD_OK == err);
408+
}

0 commit comments

Comments
 (0)