diff --git a/fsw/src/cf_cfdp.c b/fsw/src/cf_cfdp.c index c79fa8d3..7e4c0376 100644 --- a/fsw/src/cf_cfdp.c +++ b/fsw/src/cf_cfdp.c @@ -299,22 +299,6 @@ CF_Logical_PduBuffer_t *CF_CFDP_ConstructPduHeader(const CF_Transaction_t *txn, return ph; } -/*---------------------------------------------------------------- - * - * Internal helper routine only, not part of API. - * - *-----------------------------------------------------------------*/ -static inline size_t CF_strnlen(const char *str, size_t maxlen) -{ - const char *end = memchr(str, 0, maxlen); - if (end != NULL) - { - /* actual length of string is difference */ - maxlen = end - str; - } - return maxlen; -} - /*---------------------------------------------------------------- * * Application-scope internal function diff --git a/fsw/src/cf_utils.c b/fsw/src/cf_utils.c index 4b35c9b6..715dd4de 100644 --- a/fsw/src/cf_utils.c +++ b/fsw/src/cf_utils.c @@ -196,8 +196,7 @@ CFE_Status_t CF_WriteHistoryEntryToFile(osal_id_t fd, const CF_History_t *histor snprintf(linebuf, sizeof(linebuf), "DST: %s\n", history->fnames.dst_filename); break; } - - len = strlen(linebuf); + len = CF_strnlen(linebuf, (CF_FILENAME_MAX_LEN * 2) + 128); ret = CF_WrappedWrite(fd, linebuf, len); if (ret != len) { @@ -588,3 +587,22 @@ CF_TxnStatus_t CF_TxnStatus_From_ConditionCode(CF_CFDP_ConditionCode_t cc) /* All CFDP CC values directly correspond to a Transaction Status of the same numeric value */ return (CF_TxnStatus_t)cc; } + +/*---------------------------------------------------------------- + * + * Function: CF_strnlen + * + * Application-scope internal function + * See description in cf_utils.h for argument/return detail + * + *-----------------------------------------------------------------*/ +size_t CF_strnlen(const char *str, size_t maxlen) +{ + const char *end = memchr(str, 0, maxlen); + if (end != NULL) + { + /* actual length of string is difference */ + maxlen = end - str; + } + return maxlen; +} \ No newline at end of file diff --git a/fsw/src/cf_utils.h b/fsw/src/cf_utils.h index fd839ce0..81f833fd 100644 --- a/fsw/src/cf_utils.h +++ b/fsw/src/cf_utils.h @@ -518,4 +518,21 @@ CF_TxnStatus_t CF_TxnStatus_From_ConditionCode(CF_CFDP_ConditionCode_t cc); */ bool CF_TxnStatus_IsError(CF_TxnStatus_t txn_stat); +/************************************************************************/ +/** @brief Calculates the length of a string up to a maximum length + * + * Purpose: Provides a local OSAL routine to get the functionality + * of the (non-C99) "strnlen()" function, via the + * C89/C99 standard "memchr()" function instead. + * + * @par Assumptions, External Events, and Notes: + * None + * + * @param str Pointer to the input string + * @param maxlen Maximum number of characters to check + * + * @returns Length of the string up to `maxlen` characters + */ +size_t CF_strnlen(const char *str, size_t maxlen); + #endif /* !CF_UTILS_H */ diff --git a/unit-test/cf_utils_tests.c b/unit-test/cf_utils_tests.c index 41010c91..7a4ae711 100644 --- a/unit-test/cf_utils_tests.c +++ b/unit-test/cf_utils_tests.c @@ -1142,6 +1142,37 @@ void Test_CF_TxnStatus_From_ConditionCode(void) } } +/******************************************************************************* +** +** CF_strnlen tests +** +*******************************************************************************/ +void Test_CF_strnlen_null_character_found(void) +{ + /* Arrange */ + size_t result; + const char str[] = "str"; + + /* Act */ + result = CF_strnlen(str, sizeof(str)); + + /* Assert */ + UtAssert_INT32_EQ(result, 3); +} + +void Test_CF_strnlen_null_character_not_found(void) +{ + /* Arrange */ + size_t result; + const char str[] = "str"; + + /* Act */ + result = CF_strnlen(str, sizeof(str) - 1); + + /* Assert */ + UtAssert_INT32_EQ(result, 3); +} + /******************************************************************************* ** ** cf_utils_tests UtTest_Add groups @@ -1291,6 +1322,13 @@ void add_CF_WrappedLseek_tests(void) cf_utils_tests_Teardown, "Test_CF_WrappedLseek_Call_OS_lseek_WithGivenArgumentsAndReturnItsReturnValue"); } +void add_CF_strnlen_tests(void) +{ + UtTest_Add(Test_CF_strnlen_null_character_found, cf_utils_tests_Setup, + cf_utils_tests_Teardown, "Test_CF_strnlen_null_character_found"); + UtTest_Add(Test_CF_strnlen_null_character_not_found, cf_utils_tests_Setup, + cf_utils_tests_Teardown, "Test_CF_strnlen_null_character_not_found"); +} /******************************************************************************* ** ** cf_utils_tests UtTest_Setup @@ -1330,4 +1368,6 @@ void UtTest_Setup(void) add_CF_WrappedWrite_tests(); add_CF_WrappedLseek_tests(); + + add_CF_strnlen_tests(); } diff --git a/unit-test/stubs/cf_utils_stubs.c b/unit-test/stubs/cf_utils_stubs.c index bf36813b..09514b2f 100644 --- a/unit-test/stubs/cf_utils_stubs.c +++ b/unit-test/stubs/cf_utils_stubs.c @@ -41,7 +41,7 @@ void UT_DefaultHandler_CF_WriteTxnQueueDataToFile(void *, UT_EntryKey_t, const U * Generated stub function for CF_FindTransactionBySequenceNumber() * ---------------------------------------------------- */ -CF_Transaction_t *CF_FindTransactionBySequenceNumber(CF_Channel_t *chan, +CF_Transaction_t *CF_FindTransactionBySequenceNumber(CF_Channel_t * chan, CF_TransactionSeq_t transaction_sequence_number, CF_EntityId_t src_eid) { @@ -416,3 +416,20 @@ CFE_Status_t CF_WriteTxnQueueDataToFile(osal_id_t fd, CF_Channel_t *chan, CF_Que return UT_GenStub_GetReturnValue(CF_WriteTxnQueueDataToFile, CFE_Status_t); } + +/* + * ---------------------------------------------------- + * Generated stub function for CF_strnlen() + * ---------------------------------------------------- + */ +size_t CF_strnlen(const char *str, size_t maxlen) +{ + UT_GenStub_SetupReturnBuffer(CF_strnlen, size_t); + + UT_GenStub_AddParam(CF_strnlen, const char *, str); + UT_GenStub_AddParam(CF_strnlen, size_t, maxlen); + + UT_GenStub_Execute(CF_strnlen, Basic, NULL); + + return UT_GenStub_GetReturnValue(CF_strnlen, size_t); +}