From aba94878168b9b7125ab0efe2daae7b622f331bc Mon Sep 17 00:00:00 2001 From: Joseph Hickey Date: Thu, 13 Jan 2022 16:43:44 -0500 Subject: [PATCH] Fix #95, reject PDUs with large bit set 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). --- fsw/src/cf_cfdp.c | 13 +++++++++++++ fsw/src/cf_events.h | 1 + unit-test/cf_cfdp_tests.c | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/fsw/src/cf_cfdp.c b/fsw/src/cf_cfdp.c index bbdebfb0..fc068d7e 100644 --- a/fsw/src/cf_cfdp.c +++ b/fsw/src/cf_cfdp.c @@ -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); diff --git a/fsw/src/cf_events.h b/fsw/src/cf_events.h index 11c20bea..bbf083d0 100644 --- a/fsw/src/cf_events.h +++ b/fsw/src/cf_events.h @@ -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 diff --git a/unit-test/cf_cfdp_tests.c b/unit-test/cf_cfdp_tests.c index 60e2d434..8039f4d3 100644 --- a/unit-test/cf_cfdp_tests.c +++ b/unit-test/cf_cfdp_tests.c @@ -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)