Checklist (Please check before submitting)
Describe the bug
Semaphore name being blank is not an error condition, it should simply skip the semaphore get by name call. The recent refactor changed this behavior which causes the engine to crash.
Error introduced here:
|
else if (CF_AppData.config_table->chan[i].sem_name[0]) |
|
{ |
|
ret = OS_CountSemGetIdByName(&CF_AppData.engine.channels[i].sem_id, |
|
CF_AppData.config_table->chan[i].sem_name); |
|
if (ret != OS_SUCCESS) |
|
{ |
|
CFE_EVS_SendEvent(CF_EID_ERR_INIT_SEM, CFE_EVS_EventType_ERROR, |
|
"CF: failed to get sem id for name %s, error=%ld", |
|
CF_AppData.config_table->chan[i].sem_name, (long)ret); |
|
break; |
|
} |
|
else |
|
{ |
|
for (j = 0; j < CF_NUM_TRANSACTIONS_PER_CHANNEL; ++j, ++t) |
|
{ |
|
int k; |
|
|
|
t->chan_num = i; |
|
CF_FreeTransaction(t); |
|
|
|
for (k = 0; k < CF_Direction_NUM; ++k, ++c) |
|
{ |
|
CF_Assert((chunk_mem_offset + CF_DIR_MAX_CHUNKS[k][i]) <= CF_NUM_CHUNKS_ALL_CHANNELS); |
|
CF_ChunkListInit(&c->chunks, CF_DIR_MAX_CHUNKS[k][i], |
|
&CF_AppData.engine.chunk_mem[chunk_mem_offset]); |
|
chunk_mem_offset += CF_DIR_MAX_CHUNKS[k][i]; |
|
CF_CList_InitNode(&c->cl_node); |
|
CF_CList_InsertBack(&CF_AppData.engine.channels[i].cs[k], &c->cl_node); |
|
} |
|
} |
|
|
|
for (j = 0; j < CF_NUM_HISTORIES_PER_CHANNEL; ++j) |
|
{ |
|
CF_History_t *h = &CF_AppData.engine.histories[(i * CF_NUM_HISTORIES_PER_CHANNEL) + j]; |
|
CF_CList_InitNode(&h->cl_node); |
|
CF_CList_InsertBack_Ex(&CF_AppData.engine.channels[i], CF_QueueIdx_HIST_FREE, &h->cl_node); |
|
} |
|
} |
|
} |
Old code:
|
if (CF_AppData.config_table->chan[i].sem_name[0]) |
|
{ |
|
ret = OS_CountSemGetIdByName(&CF_AppData.engine.channels[i].sem_id, |
|
CF_AppData.config_table->chan[i].sem_name); |
|
if (ret != OS_SUCCESS) |
|
{ |
|
CFE_EVS_SendEvent(CF_EID_ERR_INIT_SEM, CFE_EVS_EventType_ERROR, |
|
"CF: failed to get sem id for name %s, error=%ld", |
|
CF_AppData.config_table->chan[i].sem_name, (long)ret); |
|
goto err_out; |
|
} |
|
} |
|
|
|
for (j = 0; j < CF_NUM_TRANSACTIONS_PER_CHANNEL; ++j, ++t) |
|
{ |
|
int k; |
|
|
|
t->chan_num = i; |
|
CF_FreeTransaction(t); |
|
|
|
for (k = 0; k < CF_Direction_NUM; ++k, ++c) |
|
{ |
|
CF_Assert((chunk_mem_offset + CF_DIR_MAX_CHUNKS[k][i]) <= CF_NUM_CHUNKS_ALL_CHANNELS); |
|
CF_ChunkListInit(&c->chunks, CF_DIR_MAX_CHUNKS[k][i], &CF_AppData.engine.chunk_mem[chunk_mem_offset]); |
|
chunk_mem_offset += CF_DIR_MAX_CHUNKS[k][i]; |
|
CF_CList_InitNode(&c->cl_node); |
|
CF_CList_InsertBack(&CF_AppData.engine.channels[i].cs[k], &c->cl_node); |
|
} |
|
} |
|
|
|
for (j = 0; j < CF_NUM_HISTORIES_PER_CHANNEL; ++j) |
|
{ |
|
CF_History_t *h = &CF_AppData.engine.histories[(i * CF_NUM_HISTORIES_PER_CHANNEL) + j]; |
|
CF_CList_InitNode(&h->cl_node); |
|
CF_CList_InsertBack_Ex(&CF_AppData.engine.channels[i], CF_QueueIdx_HIST_FREE, &h->cl_node); |
|
} |
To Reproduce
Initialize engine without a semaphore name defined
Expected behavior
Still initialize the transactions if the semaphore name is blank
System observed on:
Observed from CTF testing (on Linux I assume)
Additional context
None
Reporter Info
Jacob Hageman - NASA/GSFC
Checklist (Please check before submitting)
Describe the bug
Semaphore name being blank is not an error condition, it should simply skip the semaphore get by name call. The recent refactor changed this behavior which causes the engine to crash.
Error introduced here:
CF/fsw/src/cf_cfdp.c
Lines 1046 to 1084 in eba87df
Old code:
CF/fsw/src/cf_cfdp.c
Lines 1029 to 1064 in bff67f8
To Reproduce
Initialize engine without a semaphore name defined
Expected behavior
Still initialize the transactions if the semaphore name is blank
System observed on:
Observed from CTF testing (on Linux I assume)
Additional context
None
Reporter Info
Jacob Hageman - NASA/GSFC