Skip to content

Commit

Permalink
Fix nasa#93, Replaces strlen and strncpy with CS_strnlen and snprintf
Browse files Browse the repository at this point in the history
  • Loading branch information
jdfiguer authored and jdfiguer committed Jun 4, 2024
1 parent 69fc1b9 commit 82b6075
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 18 deletions.
8 changes: 4 additions & 4 deletions fsw/src/cs_compute.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,20 +536,20 @@ void CS_RecomputeEepromMemoryChildTask(void)

if (Table == CS_EEPROM_TABLE)
{
strncpy(TableType, "EEPROM", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "EEPROM");
}
if (Table == CS_MEMORY_TABLE)
{
strncpy(TableType, "Memory", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Memory");
}
if (Table == CS_CFECORE)
{
strncpy(TableType, "cFE Core", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "cFE Core");
CS_AppData.HkPacket.Payload.CfeCoreBaseline = NewChecksumValue;
}
if (Table == CS_OSCORE)
{
strncpy(TableType, "OS", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "OS");
CS_AppData.HkPacket.Payload.OSBaseline = NewChecksumValue;
}

Expand Down
2 changes: 1 addition & 1 deletion fsw/src/cs_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ CFE_Status_t CS_SbInit(void)
CFE_Status_t Result = CFE_SUCCESS;

/* Initialize app configuration data */
strncpy(CS_AppData.PipeName, CS_CMD_PIPE_NAME, CS_CMD_PIPE_NAME_LEN);
snprintf(CS_AppData.PipeName, CS_CMD_PIPE_NAME_LEN, CS_CMD_PIPE_NAME);

CS_AppData.PipeDepth = CS_PIPE_DEPTH;

Expand Down
40 changes: 28 additions & 12 deletions fsw/src/cs_table_processing.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,22 @@ CFE_Status_t CS_ValidateMemoryChecksumDefinitionTable(void *TblPtr)
return Result;
}

/*----------------------------------------------------------------
*
* Internal helper routine only, not part of API.
*
*-----------------------------------------------------------------*/
static inline size_t CS_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;
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* CS Validation Callback function for Tables Table */
Expand Down Expand Up @@ -231,7 +247,7 @@ CFE_Status_t CS_ValidateTablesChecksumDefinitionTable(void *TblPtr)
StateField = OuterEntry->State;

/* Check for non-zero length for table name */
if (strlen(OuterEntry->Name) != 0)
if (CS_strnlen(OuterEntry->Name, sizeof(OuterEntry->Name)) != 0)
{
/* Verify valid state definition */
if (((StateField == CS_STATE_EMPTY) || (StateField == CS_STATE_ENABLED) ||
Expand Down Expand Up @@ -357,7 +373,7 @@ CFE_Status_t CS_ValidateAppChecksumDefinitionTable(void *TblPtr)
}
BadCount++;
}
else if (strlen(OuterEntry->Name) != 0)
else if (CS_strnlen(OuterEntry->Name, sizeof(OuterEntry->Name)) != 0)
{
/* Verify valid state definition */
if (((StateField == CS_STATE_EMPTY) || (StateField == CS_STATE_ENABLED) ||
Expand Down Expand Up @@ -825,7 +841,7 @@ CFE_Status_t CS_TableInit(CFE_TBL_Handle_t *DefinitionTableHandle, CFE_TBL_Handl
osal_id_t Fd = OS_OBJECT_ID_UNDEFINED;
char TableType[CS_TABLETYPE_NAME_SIZE];

strncpy(TableType, "Undef Tbl", CS_TABLETYPE_NAME_SIZE); /* Init table type */
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Undef Tbl"); /* Init table type */

SizeOfTable = NumEntries * SizeofResultsTableEntry;

Expand Down Expand Up @@ -904,19 +920,19 @@ CFE_Status_t CS_TableInit(CFE_TBL_Handle_t *DefinitionTableHandle, CFE_TBL_Handl
{
if (Table == CS_EEPROM_TABLE)
{
strncpy(TableType, "EEPROM", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "EEPROM");
}
if (Table == CS_MEMORY_TABLE)
{
strncpy(TableType, "Memory", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Memory");
}
if (Table == CS_TABLES_TABLE)
{
strncpy(TableType, "Tables", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Tables");
}
if (Table == CS_APP_TABLE)
{
strncpy(TableType, "Apps", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Apps");
}

CFE_EVS_SendEvent(CS_TBL_INIT_ERR_EID, CFE_EVS_EventType_ERROR,
Expand Down Expand Up @@ -967,7 +983,7 @@ CFE_Status_t CS_HandleTableUpdate(void *DefinitionTblPtr, void *ResultsTblPtr, C
int32 Loop = 0;
char TableType[CS_TABLETYPE_NAME_SIZE];

strncpy(TableType, "Undef Tbl", CS_TABLETYPE_NAME_SIZE); /* Init table type */
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Undef Tbl"); /* Init table type */

/* Below, there are several values that are returned and assigned, but never evaluated. */
/* This is done so intentionally, as it helps us with Source-Level debugging this functions. */
Expand Down Expand Up @@ -1031,19 +1047,19 @@ CFE_Status_t CS_HandleTableUpdate(void *DefinitionTblPtr, void *ResultsTblPtr, C
{
if (Table == CS_EEPROM_TABLE)
{
strncpy(TableType, "EEPROM", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "EEPROM");
}
if (Table == CS_MEMORY_TABLE)
{
strncpy(TableType, "Memory", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Memory");
}
if (Table == CS_TABLES_TABLE)
{
strncpy(TableType, "Table", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "Table");
}
if (Table == CS_APP_TABLE)
{
strncpy(TableType, "App", CS_TABLETYPE_NAME_SIZE);
snprintf(TableType, CS_TABLETYPE_NAME_SIZE, "App");
}

/* There was a problem somewhere, generate an event */
Expand Down
3 changes: 2 additions & 1 deletion unit-test/cs_table_processing_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,8 @@ void CS_ValidateTablesChecksumDefinitionTable_Test_UndefTableErrorResult(void)

strncpy(CS_AppData.DefTablesTblPtr[0].Name, "name", 10);
strncpy(CS_AppData.DefTablesTblPtr[1].Name, "name", 10);
strncpy(CS_AppData.DefTablesTblPtr[2].Name, "name", 10);
memset(CS_AppData.DefTablesTblPtr[2].Name, 0xFF, sizeof(CS_AppData.DefTablesTblPtr[2].Name));
/* This test also covers CS_strnlen false branch */

/* Execute the function being tested */
Result = CS_ValidateTablesChecksumDefinitionTable(CS_AppData.DefTablesTblPtr);
Expand Down

0 comments on commit 82b6075

Please sign in to comment.