Skip to content

Commit

Permalink
Fix #95, reject PDUs with large bit set
Browse files Browse the repository at this point in the history
This bit indicates that the PDU has 64-bit size and offset fields.
CF currently does not support large file sizes.  It needs to reject
these packets as they will corrupt the data because they are not
decoded properly (decode is fixed at 32 bit sizes).
  • Loading branch information
jphickey committed Jan 13, 2022
1 parent d3ae3f9 commit 82dc533
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
13 changes: 13 additions & 0 deletions fsw/src/cf_cfdp.c
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,19 @@ int CF_CFDP_RecvPh(uint8 chan_num, CF_Logical_PduBuffer_t *ph)

CF_CFDP_DecodeHeader(ph->pdec, &ph->pdu_header);

/*
* The "large file" flag is not supported by this implementation yet.
* This means file sizes and offsets will be 64 bits, so codec routines
* will need to be updated to understand this. OSAL also doesn't support
* 64-bit file access yet.
*/
if (CF_CODEC_IS_OK(ph->pdec) && ph->pdu_header.large_flag)
{
CFE_EVS_SendEvent(CF_EID_ERR_PDU_LARGE_FILE, CFE_EVS_EventType_ERROR,
"CF: pdu with large file bit received (unsupported)");
goto err_out;
}

if (CF_CODEC_IS_OK(ph->pdec) && ph->pdu_header.pdu_type == 0)
{
CF_CFDP_DecodeFileDirectiveHeader(ph->pdec, &ph->fdirective);
Expand Down
1 change: 1 addition & 0 deletions fsw/src/cf_events.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
#define CF_EID_ERR_PDU_GET_EID_SIZE 52
#define CF_EID_ERR_PDU_GET_TSN_SIZE 53
#define CF_EID_ERR_PDU_FD_UNSUPPORTED 54
#define CF_EID_ERR_PDU_LARGE_FILE 55

/* CF_CFDP event ids (engine) */
#define CF_EID_ERR_CFDP_RX_DROPPED 60
Expand Down
4 changes: 2 additions & 2 deletions fsw/tables/cf_def_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ CF_ConfigTable_t CF_config_table = {
0x08c2,
16,
{{5, 25, CF_CFDP_CLASS_2, 23, "/cf/poll_dir", "./poll_dir", 0}, {0}, {0}, {0}, {0}},
"cf_1_sem",
"", /* throttle sem for channel 1, empty string means no throttle */
1,
},
{5, /* max number of outgoing messages per wakeup */
Expand All @@ -48,7 +48,7 @@ CF_ConfigTable_t CF_config_table = {
0x08c3,
16,
{{0}, {0}, {0}, {0}, {0}},
"cf_2_sem",
"", /* throttle sem for channel 2, empty string means no throttle */
1}},
3, /* ack timer */
3, /* nak timer */
Expand Down
6 changes: 6 additions & 0 deletions unit-test/cf_cfdp_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,12 @@ void Test_CF_CFDP_RecvPh(void)
CF_CODEC_SET_DONE(ph->pdec);
UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), -1);
UT_CF_AssertEventID(CF_EID_ERR_PDU_SHORT_HEADER);

/* decode error, large file bit set */
UT_CFDP_SetupBasicTestState(UT_CF_Setup_RX, &ph, NULL, NULL, NULL, NULL);
ph->pdu_header.large_flag = true;
UtAssert_INT32_EQ(CF_CFDP_RecvPh(UT_CFDP_CHANNEL, ph), -1);
UT_CF_AssertEventID(CF_EID_ERR_PDU_LARGE_FILE);
}

void Test_CF_CFDP_RecvMd(void)
Expand Down

0 comments on commit 82dc533

Please sign in to comment.