Skip to content

Commit b878cd8

Browse files
authored
Merge pull request #2669 from nasa/integration-candidate
cFE Integration candidate: Equuleus-rc1+dev32
2 parents fc8c48a + 53e40f4 commit b878cd8

File tree

8 files changed

+145
-130
lines changed

8 files changed

+145
-130
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## Development Build: equuleus-rc1+dev259
4+
- 'Fix #2641, improve validation in app control API'
5+
- See: <https://github.com/nasa/cFE/pull/2666>
6+
7+
38
## Development Build: equuleus-rc1+dev251
49
- 'Fix #2651, initialize pipename buffer'
510
- See: <https://github.com/nasa/cFE/pull/2652>

modules/cfe_testcase/src/es_application_control_test.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,7 @@ void TestApplicationControl(void)
3838
UtAssert_INT32_EQ(CFE_ES_GetAppID(&TestAppId), CFE_SUCCESS);
3939

4040
UtAssert_UINT32_EQ(CFE_ES_RestartApp(CFE_ES_APPID_UNDEFINED), CFE_ES_ERR_RESOURCEID_NOT_VALID);
41-
/*
42-
* This seems a bit strange that it throws a file io error
43-
* CFE_ES_ReloadApp calls OS_stat with the null filename
44-
* OS_stat should return OS_INVALID_POINTER, but the exact
45-
* error is ignored in CFE_ES_ReloadApp and file io error is returned
46-
* most other functions return a CFE_ES_BAD_ARGUMENT in this situation
47-
*/
48-
UtAssert_UINT32_EQ(CFE_ES_ReloadApp(TestAppId, NULL), CFE_ES_FILE_IO_ERR);
41+
UtAssert_UINT32_EQ(CFE_ES_ReloadApp(TestAppId, NULL), CFE_ES_BAD_ARGUMENT);
4942
UtAssert_UINT32_EQ(CFE_ES_ReloadApp(TestAppId, "/cf/NOT_cfe_testcase.so"), CFE_ES_FILE_IO_ERR);
5043
UtAssert_UINT32_EQ(CFE_ES_ReloadApp(CFE_ES_APPID_UNDEFINED, "/cf/cfe_testcase.so"),
5144
CFE_ES_ERR_RESOURCEID_NOT_VALID);

modules/core_private/ut-stubs/src/ut_osprintf_stubs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ const char *UT_OSP_MESSAGES[] = {
9999
[UT_OSP_RECORD_USED] = "%s: Error: ES_TaskTable slot for ID %lx in use at task creation!\n",
100100
[UT_OSP_TASKEXIT_BAD_CONTEXT] = "%s: Called from invalid task context\n",
101101
[UT_OSP_BACKGROUND_TAKE] = "%s: Failed to take background sem: %08lx\n",
102-
[UT_OSP_INVALID_ID] = "%s: Invalid Application ID received, AppID = %lu\n",
102+
[UT_OSP_INVALID_ID] = "%s: Invalid Application ID received for %s, AppID = %lu\n",
103103
[UT_OSP_RESTART_NO_FILE] = "%s: Cannot Restart Application %s, File %s does not exist.\n",
104104
[UT_OSP_CREATECHILD_FROM_CHILD] = "%s: Error: Cannot call from a Child Task (for Task '%s').\n",
105105
[UT_OSP_DELETECHID_MAIN_TASK] = "%s: Error: Task %lu is a cFE Main Task.\n",

modules/es/fsw/src/cfe_es_api.c

Lines changed: 46 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -162,55 +162,29 @@ CFE_Status_t CFE_ES_RestartApp(CFE_ES_AppId_t AppID)
162162
os_fstat_t FileStatus;
163163
CFE_ES_AppRecord_t *AppRecPtr;
164164

165-
AppRecPtr = CFE_ES_LocateAppRecordByID(AppID);
166-
if (AppRecPtr != NULL)
165+
AppRecPtr = CFE_ES_LockUserAppRecord(AppID, "Restart");
166+
if (AppRecPtr == NULL)
167167
{
168-
CFE_ES_LockSharedData(__func__, __LINE__);
169-
170-
/*
171-
** Check to see if the App is an external cFE App.
172-
*/
173-
if (AppRecPtr->Type == CFE_ES_AppType_CORE)
174-
{
175-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Restart a CORE Application: %s.\n", __func__,
176-
CFE_ES_AppRecordGetName(AppRecPtr));
177-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
178-
}
179-
else if (AppRecPtr->AppState != CFE_ES_AppState_RUNNING)
168+
/* Lock function already wrote log message */
169+
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
170+
}
171+
else
172+
{
173+
if (OS_stat(AppRecPtr->StartParams.BasicInfo.FileName, &FileStatus) == OS_SUCCESS)
180174
{
181-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Restart Application %s, It is not running.\n", __func__,
175+
CFE_ES_SysLogWrite_Unsync("%s: Restart Application %s Initiated\n", __func__,
182176
CFE_ES_AppRecordGetName(AppRecPtr));
183-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
177+
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_RESTART;
184178
}
185179
else
186180
{
187-
/*
188-
** Check to see if the file exists
189-
*/
190-
if (OS_stat(AppRecPtr->StartParams.BasicInfo.FileName, &FileStatus) == OS_SUCCESS)
191-
{
192-
CFE_ES_SysLogWrite_Unsync("%s: Restart Application %s Initiated\n", __func__,
193-
CFE_ES_AppRecordGetName(AppRecPtr));
194-
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_RESTART;
195-
}
196-
else
197-
{
198-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Restart Application %s, File %s does not exist.\n", __func__,
199-
CFE_ES_AppRecordGetName(AppRecPtr),
200-
AppRecPtr->StartParams.BasicInfo.FileName);
201-
ReturnCode = CFE_ES_FILE_IO_ERR;
202-
}
181+
CFE_ES_SysLogWrite_Unsync("%s: Cannot Restart Application %s, File %s does not exist.\n", __func__,
182+
CFE_ES_AppRecordGetName(AppRecPtr), AppRecPtr->StartParams.BasicInfo.FileName);
183+
ReturnCode = CFE_ES_FILE_IO_ERR;
203184
}
204185

205186
CFE_ES_UnlockSharedData(__func__, __LINE__);
206187
}
207-
else /* App ID is not valid */
208-
{
209-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
210-
211-
CFE_ES_WriteToSysLog("%s: Invalid Application ID received, AppID = %lu\n", __func__,
212-
CFE_RESOURCEID_TO_ULONG(AppID));
213-
}
214188

215189
return ReturnCode;
216190
}
@@ -225,58 +199,42 @@ CFE_Status_t CFE_ES_ReloadApp(CFE_ES_AppId_t AppID, const char *AppFileName)
225199
{
226200
int32 ReturnCode = CFE_SUCCESS;
227201
os_fstat_t FileStatus;
228-
CFE_ES_AppRecord_t *AppRecPtr = CFE_ES_LocateAppRecordByID(AppID);
202+
CFE_ES_AppRecord_t *AppRecPtr;
229203

230-
if (AppRecPtr != NULL)
204+
if (AppFileName == NULL)
231205
{
232-
CFE_ES_LockSharedData(__func__, __LINE__);
206+
return CFE_ES_BAD_ARGUMENT;
207+
}
233208

209+
AppRecPtr = CFE_ES_LockUserAppRecord(AppID, "Reload");
210+
if (AppRecPtr == NULL)
211+
{
212+
/* Lock function already wrote log message */
213+
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
214+
}
215+
else
216+
{
234217
/*
235-
** Check to see if the App is an external cFE App.
218+
** Check to see if the file exists
236219
*/
237-
if (AppRecPtr->Type == CFE_ES_AppType_CORE)
238-
{
239-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Reload a CORE Application: %s.\n", __func__,
240-
CFE_ES_AppRecordGetName(AppRecPtr));
241-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
242-
}
243-
else if (AppRecPtr->AppState != CFE_ES_AppState_RUNNING)
220+
if (OS_stat(AppFileName, &FileStatus) == OS_SUCCESS)
244221
{
245-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Reload Application %s, It is not running.\n", __func__,
246-
CFE_ES_AppRecordGetName(AppRecPtr));
247-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
222+
CFE_ES_SysLogWrite_Unsync("%s: Reload Application %s Initiated. New filename = %s\n", __func__,
223+
CFE_ES_AppRecordGetName(AppRecPtr), AppFileName);
224+
strncpy(AppRecPtr->StartParams.BasicInfo.FileName, AppFileName,
225+
sizeof(AppRecPtr->StartParams.BasicInfo.FileName) - 1);
226+
AppRecPtr->StartParams.BasicInfo.FileName[sizeof(AppRecPtr->StartParams.BasicInfo.FileName) - 1] = 0;
227+
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_RELOAD;
248228
}
249229
else
250230
{
251-
/*
252-
** Check to see if the file exists
253-
*/
254-
if (OS_stat(AppFileName, &FileStatus) == OS_SUCCESS)
255-
{
256-
CFE_ES_SysLogWrite_Unsync("%s: Reload Application %s Initiated. New filename = %s\n", __func__,
257-
CFE_ES_AppRecordGetName(AppRecPtr), AppFileName);
258-
strncpy(AppRecPtr->StartParams.BasicInfo.FileName, AppFileName,
259-
sizeof(AppRecPtr->StartParams.BasicInfo.FileName) - 1);
260-
AppRecPtr->StartParams.BasicInfo.FileName[sizeof(AppRecPtr->StartParams.BasicInfo.FileName) - 1] = 0;
261-
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_RELOAD;
262-
}
263-
else
264-
{
265-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Reload Application %s, File %s does not exist.\n", __func__,
266-
CFE_ES_AppRecordGetName(AppRecPtr), AppFileName);
267-
ReturnCode = CFE_ES_FILE_IO_ERR;
268-
}
231+
CFE_ES_SysLogWrite_Unsync("%s: Cannot Reload Application %s, File %s does not exist.\n", __func__,
232+
CFE_ES_AppRecordGetName(AppRecPtr), AppFileName);
233+
ReturnCode = CFE_ES_FILE_IO_ERR;
269234
}
270235

271236
CFE_ES_UnlockSharedData(__func__, __LINE__);
272237
}
273-
else /* App ID is not valid */
274-
{
275-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
276-
277-
CFE_ES_WriteToSysLog("%s: Invalid Application ID received, AppID = %lu\n", __func__,
278-
CFE_RESOURCEID_TO_ULONG(AppID));
279-
}
280238

281239
return ReturnCode;
282240
}
@@ -290,42 +248,21 @@ CFE_Status_t CFE_ES_ReloadApp(CFE_ES_AppId_t AppID, const char *AppFileName)
290248
CFE_Status_t CFE_ES_DeleteApp(CFE_ES_AppId_t AppID)
291249
{
292250
int32 ReturnCode = CFE_SUCCESS;
293-
CFE_ES_AppRecord_t *AppRecPtr = CFE_ES_LocateAppRecordByID(AppID);
251+
CFE_ES_AppRecord_t *AppRecPtr;
294252

295-
if (AppRecPtr != NULL)
253+
AppRecPtr = CFE_ES_LockUserAppRecord(AppID, "Delete");
254+
if (AppRecPtr == NULL)
296255
{
297-
CFE_ES_LockSharedData(__func__, __LINE__);
298-
299-
/*
300-
** Check to see if the App is an external cFE App.
301-
*/
302-
if (AppRecPtr->Type == CFE_ES_AppType_CORE)
303-
{
304-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Delete a CORE Application: %s.\n", __func__,
305-
CFE_ES_AppRecordGetName(AppRecPtr));
306-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
307-
}
308-
else if (AppRecPtr->AppState != CFE_ES_AppState_RUNNING)
309-
{
310-
CFE_ES_SysLogWrite_Unsync("%s: Cannot Delete Application %s, It is not running.\n", __func__,
311-
CFE_ES_AppRecordGetName(AppRecPtr));
312-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
313-
}
314-
else
315-
{
316-
CFE_ES_SysLogWrite_Unsync("%s: Delete Application %s Initiated\n", __func__,
317-
CFE_ES_AppRecordGetName(AppRecPtr));
318-
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_DELETE;
319-
}
320-
321-
CFE_ES_UnlockSharedData(__func__, __LINE__);
256+
/* Lock function already wrote log message */
257+
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
322258
}
323-
else /* App ID is not valid */
259+
else
324260
{
325-
ReturnCode = CFE_ES_ERR_RESOURCEID_NOT_VALID;
261+
CFE_ES_SysLogWrite_Unsync("%s: Delete Application %s Initiated\n", __func__,
262+
CFE_ES_AppRecordGetName(AppRecPtr));
263+
AppRecPtr->ControlReq.AppControlRequest = CFE_ES_RunStatus_SYS_DELETE;
326264

327-
CFE_ES_WriteToSysLog("%s: Invalid Application ID received, AppID = %lu\n", __func__,
328-
CFE_RESOURCEID_TO_ULONG(AppID));
265+
CFE_ES_UnlockSharedData(__func__, __LINE__);
329266
}
330267

331268
return ReturnCode;

modules/es/fsw/src/cfe_es_apps.c

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,49 @@
6262
***************************************************************************
6363
*/
6464

65+
/*----------------------------------------------------------------
66+
*
67+
* Application-scope internal function
68+
* See description in header file for argument/return detail
69+
*
70+
*-----------------------------------------------------------------*/
71+
CFE_ES_AppRecord_t *CFE_ES_LockUserAppRecord(CFE_ES_AppId_t AppID, const char *LogMsgAction)
72+
{
73+
CFE_ES_AppRecord_t *AppRecPtr;
74+
bool IsValid;
75+
76+
IsValid = false;
77+
AppRecPtr = CFE_ES_LocateAppRecordByID(AppID);
78+
CFE_ES_LockSharedData(__func__, __LINE__);
79+
if (!CFE_ES_AppRecordIsMatch(AppRecPtr, AppID))
80+
{
81+
CFE_ES_WriteToSysLog("%s: Invalid Application ID received for %s, AppID = %lu\n", __func__, LogMsgAction,
82+
CFE_RESOURCEID_TO_ULONG(AppID));
83+
}
84+
else if (AppRecPtr->Type == CFE_ES_AppType_CORE)
85+
{
86+
CFE_ES_SysLogWrite_Unsync("%s: Cannot %s a CORE Application: %s.\n", __func__, LogMsgAction,
87+
CFE_ES_AppRecordGetName(AppRecPtr));
88+
}
89+
else if (AppRecPtr->AppState != CFE_ES_AppState_RUNNING)
90+
{
91+
CFE_ES_SysLogWrite_Unsync("%s: Cannot %s Application %s, It is not running.\n", __func__, LogMsgAction,
92+
CFE_ES_AppRecordGetName(AppRecPtr));
93+
}
94+
else
95+
{
96+
IsValid = true;
97+
}
98+
99+
if (!IsValid)
100+
{
101+
CFE_ES_UnlockSharedData(__func__, __LINE__);
102+
AppRecPtr = NULL;
103+
}
104+
105+
return AppRecPtr;
106+
}
107+
65108
/*----------------------------------------------------------------
66109
*
67110
* Application-scope internal function
@@ -284,8 +327,8 @@ void CFE_ES_StartApplications(uint32 ResetType, const char *StartFilePath)
284327
*-----------------------------------------------------------------*/
285328
int32 CFE_ES_ParseFileEntry(const char **TokenList, uint32 NumTokens)
286329
{
287-
const char *ModuleName;
288-
const char *EntryType;
330+
const char * ModuleName;
331+
const char * EntryType;
289332
unsigned long ParsedValue;
290333
union
291334
{
@@ -495,7 +538,7 @@ int32 CFE_ES_LoadModule(CFE_ResourceId_t ParentResourceId, const char *ModuleNam
495538
*-----------------------------------------------------------------*/
496539
int32 CFE_ES_GetTaskFunction(CFE_ES_TaskEntryFuncPtr_t *FuncPtr)
497540
{
498-
CFE_ES_TaskRecord_t *TaskRecPtr;
541+
CFE_ES_TaskRecord_t * TaskRecPtr;
499542
CFE_ES_TaskEntryFuncPtr_t EntryFunc;
500543
int32 ReturnCode;
501544
int32 Timeout;
@@ -806,10 +849,10 @@ int32 CFE_ES_AppCreate(CFE_ES_AppId_t *ApplicationIdPtr, const char *AppName, co
806849
if (CleanupStatus != OS_SUCCESS)
807850
{
808851
CFE_ES_WriteToSysLog("%s: Module (ID:0x%08lX) Unload failed. RC=%ld\n", __func__,
809-
OS_ObjectIdToInteger(AppRecPtr->LoadStatus.ModuleId), (long)CleanupStatus);
852+
OS_ObjectIdToInteger(AppRecPtr->LoadStatus.ModuleId), (long)CleanupStatus);
810853
}
811854
}
812-
855+
813856
CFE_ES_AppRecordSetFree(AppRecPtr);
814857
PendingResourceId = CFE_RESOURCEID_UNDEFINED;
815858
}
@@ -830,7 +873,7 @@ int32 CFE_ES_AppCreate(CFE_ES_AppId_t *ApplicationIdPtr, const char *AppName, co
830873
int32 CFE_ES_LoadLibrary(CFE_ES_LibId_t *LibraryIdPtr, const char *LibName, const CFE_ES_ModuleLoadParams_t *Params)
831874
{
832875
CFE_ES_LibraryEntryFuncPtr_t FunctionPointer;
833-
CFE_ES_LibRecord_t *LibSlotPtr;
876+
CFE_ES_LibRecord_t * LibSlotPtr;
834877
int32 Status;
835878
CFE_ResourceId_t PendingResourceId;
836879

@@ -985,7 +1028,7 @@ bool CFE_ES_RunAppTableScan(uint32 ElapsedTime, void *Arg)
9851028
{
9861029
CFE_ES_AppTableScanState_t *State = (CFE_ES_AppTableScanState_t *)Arg;
9871030
uint32 i;
988-
CFE_ES_AppRecord_t *AppPtr;
1031+
CFE_ES_AppRecord_t * AppPtr;
9891032
CFE_ES_AppId_t AppTimeoutList[CFE_PLATFORM_ES_MAX_APPLICATIONS];
9901033
uint32 NumAppTimeouts;
9911034

@@ -1103,14 +1146,14 @@ bool CFE_ES_RunAppTableScan(uint32 ElapsedTime, void *Arg)
11031146
*-----------------------------------------------------------------*/
11041147
void CFE_ES_ProcessControlRequest(CFE_ES_AppId_t AppId)
11051148
{
1106-
CFE_ES_AppRecord_t *AppRecPtr;
1149+
CFE_ES_AppRecord_t * AppRecPtr;
11071150
uint32 PendingControlReq;
11081151
CFE_ES_AppStartParams_t RestartParams;
11091152
char OrigAppName[OS_MAX_API_NAME];
11101153
CFE_Status_t CleanupStatus;
11111154
CFE_Status_t StartupStatus;
11121155
CFE_ES_AppId_t NewAppId;
1113-
const char *ReqName;
1156+
const char * ReqName;
11141157
char MessageDetail[48];
11151158
uint16 EventID;
11161159
CFE_EVS_EventType_Enum_t EventType;
@@ -1336,8 +1379,8 @@ int32 CFE_ES_CleanUpApp(CFE_ES_AppId_t AppId)
13361379
osal_id_t ModuleId;
13371380
uint32 NumTasks;
13381381
uint32 NumPools;
1339-
CFE_ES_AppRecord_t *AppRecPtr;
1340-
CFE_ES_TaskRecord_t *TaskRecPtr;
1382+
CFE_ES_AppRecord_t * AppRecPtr;
1383+
CFE_ES_TaskRecord_t * TaskRecPtr;
13411384
CFE_ES_MemPoolRecord_t *MemPoolRecPtr;
13421385

13431386
NumTasks = 0;

modules/es/fsw/src/cfe_es_apps.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,24 @@ int32 CFE_ES_GetTaskFunction(CFE_ES_TaskEntryFuncPtr_t *FuncPtr);
222222
*/
223223
void CFE_ES_TaskEntryPoint(void);
224224

225+
/*---------------------------------------------------------------------------------------*/
226+
/**
227+
* Helper function to find a matching app record for an operation
228+
*
229+
* Returns a pointer to the matching app record after verifying:
230+
* 1. The appID is valid and matches
231+
* 2. The app is a user defined app, not a CORE app
232+
* 3. The app is running
233+
*
234+
* If successful, the pointer to the record is returned with the ES lock
235+
* still held from the check, ready for the actual operation. The lock must
236+
* be released by the caller.
237+
*
238+
* If any check failed, writes to syslog, releases the lock, and returns NULL.
239+
* There is no additional action to be taken by the caller in this case.
240+
*/
241+
CFE_ES_AppRecord_t *CFE_ES_LockUserAppRecord(CFE_ES_AppId_t AppID, const char *LogMsgAction);
242+
225243
/*---------------------------------------------------------------------------------------*/
226244
/**
227245
* Helper function to start (but not load) a new app/lib module

0 commit comments

Comments
 (0)