Added taskDeleteHook clean up function to support commands after Ctrl+C (#69)
Log:
```
sysToMonitor: reboot type BOOT_NORMAL
0x1f03d20 (tRootTask): logging started to /tyCo/0 [3], queue size 50
0x1f03d20 (tRootTask): before usrNetInit()
0x1f03d20 (tRootTask): after usrNetInit()
Wait Flash and Network initialisation ...
Error reading target netmask information.
Defaulting netmask to 0xFFFFFF00.
Using default network mask = 0xFFFFFF00
User Network Init ... done
Launch CMT interface ... Done
[VxWorks Boot]:
0x1f03d20 (tRootTask): sysStartNetDev: Failed to set mask on device motfcc, unit: 1
RTClock set at: 5/1/2000 a 0:14:22
Instantiating /RAMDEV as rawFs, device = 0x40001
Formatting /RAMDEV for DOSFS
Instantiating /RAMDEV as rawFs, device = 0x40001
Formatting...OK.
Ram Disk </RAMDEV> format and mount done.
Verify Flash structure
Flash structure check finished
@
boot device : motfcc
unit number : 0
processor number : 0
host name : host
file name : vxWorks
inet on ethernet (e) : 192.168.0.18
host inet (h) : 192.168.0.110
user (u) : user
ftp password (pw) : password
flags (f) : 0x4
target name (tn) : C264
other (o) : motfcc
Loading... 5618296 + 408 + 624 + 616724
Starting at 0x10000...
Adding 15079 symbols for standalone.
VxWorks
Copyright 1984-2026 Wind River Systems, Inc.
CPU: Schneider Electric C264 CPU3 - MPC8270 PowerQUICC II core Frequency 262 MHz
Runtime Name: VxWorks
Runtime Version: 6.9
BSP version: 6.9/D0.22
Created: Jun 23 2026 01:17:59
ED&R Policy Mode: Deployed
WDB Comm Type: WDB_COMM_END
WDB: Agent Disabled.
-> cmd
[vxWorks]# genrsa -out pkey_new.pem 1024
[vxWorks]#
0x0007be50 vxTaskEntry +0x48 : 0x003a4788 ()
0x003a4788 shellTask +0x4a8: shellExec ()
0x003a41b0 shellExec +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2 +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read +0x30 : 0x0036384c ()
0x003638bc close +0xe0 : iosRead ()
0x00366030 iosRead +0x54 : tyRead ()
0x0036da78 tyRead +0x34 : semTake (0x1bc938)
0x004a1150 semTake +0x7c : semBTake ()
Shell task 'tShell0' restarted...
[vxWorks]# genrsa -out pkey_new1.pem 1024
[vxWorks]#
0x0007be50 vxTaskEntry +0x48 : 0x003a4788 ()
0x003a4788 shellTask +0x4a8: shellExec ()
0x003a41b0 shellExec +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2 +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read +0x30 : 0x0036384c ()
0x003638bc close +0xe0 : iosRead ()
0x00366030 iosRead +0x54 : tyRead ()
0x0036da78 tyRead +0x34 : semTake (0x1bc938)
0x004a1150 semTake +0x7c : semBTake ()
Shell task 'tShell0' restarted...
[vxWorks]#
0x0007be50 vxTaskEntry +0x48 : 0x003a4788 ()
0x003a4788 shellTask +0x4a8: shellExec ()
0x003a41b0 shellExec +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2 +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read +0x30 : 0x0036384c ()
0x003638bc close +0xe0 : iosRead ()
0x00366030 iosRead +0x54 : tyRead ()
0x0036da78 tyRead +0x34 : semTake (0x10)
0x004a1150 semTake +0x7c : semBTake ()
Shell task 'tShell0' restarted...
[vxWorks]#
[vxWorks]# C
-> tss_symlist_show
=== TSS Symbol Table ===
TINFO ONCE_ARGSTR TSSKEYNAME TSSKEYVAL STATE CLONE
-------------------------------------------------------------------------------------------------------------------------------------
=== End of Table ===
value = 0 = 0x0
-> cmd
[vxWorks]# rand -hex 128
d187fc72364bbfb675724c93a0e9331ce2e51d519f32e7d258d88706e40c2faf7f575a307cc5965f9945b9df0548cdbd3a0d9f832edb803166a09be9449b01df94656ff1df3b7c0bf398e1e03225e9189534325b050dde670315eb4607cbbc4eab108ba8f60effb0111246bd6beec80b4367260ad9e599410ada2f49eec9bbb6
[vxWorks]# C
->
0x0007be50 vxTaskEntry +0x48 : 0x003a4788 ()
0x003a4788 shellTask +0x4a8: shellExec ()
0x003a41b0 shellExec +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2 +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read +0x30 : 0x0036384c ()
0x003638bc close +0xe0 : iosRead ()
0x00366030 iosRead +0x54 : tyRead ()
0x0036da78 tyRead +0x34 : semTake (0x17bb501)
0x004a1150 semTake +0x7c : semBTake ()
Shell task 'tShell0' restarted...
-> cmd
[vxWorks]# genrsa -out pkey_new2.pem 2048
[vxWorks]# enc -aes-256-cbc -in plain.txt -out cipher.enc -K 4d794145533235364b6579466f72546573743132333435363738393000000000 -iv 496e6974566563746f72313643686172
[vxWorks]#
0x0007be50 vxTaskEntry +0x48 : 0x003a4788 ()
0x003a4788 shellTask +0x4a8: shellExec ()
0x003a41b0 shellExec +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2 +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read +0x30 : 0x0036384c ()
0x003638bc close +0xe0 : iosRead ()
0x00366030 iosRead +0x54 : tyRead ()
0x0036da78 tyRead +0x34 : semTake (0x4b657946)
0x004a1150 semTake +0x7c : semBTake ()
Shell task 'tShell0' restarted...
[vxWorks]# enc -aes-256-cbc -d -in cipher.enc -out decrypted.txt -K 4d794145533235364b6579466f72546573743132333435363738393000000000 -iv 496e6974566563746f72313643686172
[vxWorks]#
```
Co-authored-by: subhamgdeb <subhamgdeb>
Reviewed-on: http://13.234.246.121:3000/Neominds/ossl35vx69/pulls/69
Co-authored-by: Subham Gangdeb <subham.gangdeb@neominds.in>
Co-committed-by: Subham Gangdeb <subham.gangdeb@neominds.in>
This commit is contained in:
committed by
neelimap
co-authored by
subhamgdeb
parent
769a9eefc7
commit
680b258e4e
@@ -17,6 +17,7 @@ typedef struct {
|
|||||||
char run_once_arg_str[MAX_STR_LEN];
|
char run_once_arg_str[MAX_STR_LEN];
|
||||||
char tss_key_name[MAX_STR_LEN];
|
char tss_key_name[MAX_STR_LEN];
|
||||||
tss_t *tss_key;
|
tss_t *tss_key;
|
||||||
|
void (*dtor)(void *);
|
||||||
} tss_sym_info;
|
} tss_sym_info;
|
||||||
|
|
||||||
/* Sym table entry */
|
/* Sym table entry */
|
||||||
@@ -202,7 +203,8 @@ tss_symlist_add_new_internal(TASK_ID taskId,
|
|||||||
char *tss_key_name,
|
char *tss_key_name,
|
||||||
tss_t *key,
|
tss_t *key,
|
||||||
tss_sym_state state,
|
tss_sym_state state,
|
||||||
int cloned)
|
int cloned,
|
||||||
|
void (*dtor)(void *))
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
@@ -220,12 +222,55 @@ tss_symlist_add_new_internal(TASK_ID taskId,
|
|||||||
strncpy(tss_sym_table[idx].info.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
|
strncpy(tss_sym_table[idx].info.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
|
||||||
tss_sym_table[idx].info.tss_key_name[MAX_STR_LEN - 1] = '\0';
|
tss_sym_table[idx].info.tss_key_name[MAX_STR_LEN - 1] = '\0';
|
||||||
tss_sym_table[idx].info.tss_key = (tss_t*)key;
|
tss_sym_table[idx].info.tss_key = (tss_t*)key;
|
||||||
|
tss_sym_table[idx].info.dtor = dtor;
|
||||||
tss_sym_table[idx].state = state;
|
tss_sym_table[idx].state = state;
|
||||||
tss_sym_table[idx].cloned = cloned;
|
tss_sym_table[idx].cloned = cloned;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* taskHook cleanup */
|
||||||
|
void
|
||||||
|
tss_symlist_task_cleanup_hook(int taskId)
|
||||||
|
{
|
||||||
|
const char *name = taskName(taskId);
|
||||||
|
|
||||||
|
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) {
|
||||||
|
if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID ||
|
||||||
|
tss_sym_table[i].taskid != taskId)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tss_t *thread_local_ptr = tss_sym_table[i].info.tss_key;
|
||||||
|
tss_entry_t *entry = (tss_entry_t *)(*thread_local_ptr);
|
||||||
|
|
||||||
|
/* Clear the global key pointer for this task immediately */
|
||||||
|
*thread_local_ptr = (tss_t)0;
|
||||||
|
|
||||||
|
if (entry) {
|
||||||
|
|
||||||
|
/* Call destructor only if entry->var is non‑NULL and looks valid */
|
||||||
|
if (entry->var && tss_sym_table[i].info.dtor) {
|
||||||
|
tss_sym_table[i].info.dtor(entry->var);
|
||||||
|
}
|
||||||
|
|
||||||
|
taskVarDelete(taskId, (void *)&entry->var);
|
||||||
|
entry->var = NULL;
|
||||||
|
entry->dtor = NULL;
|
||||||
|
free(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clear the table slot */
|
||||||
|
memset(&tss_sym_table[i], 0, sizeof(tss_sym_entry));
|
||||||
|
tss_sym_table[i].info.tss_key = NULL;
|
||||||
|
tss_sym_table[i].state = TSS_SYMLIST_STATE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
CRYPTO_THREAD_unlock(tss_sym_table_lock);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize the TSS symbol table and clone list */
|
/* Initialize the TSS symbol table and clone list */
|
||||||
int
|
int
|
||||||
tss_sym_init(void)
|
tss_sym_init(void)
|
||||||
@@ -247,6 +292,9 @@ tss_sym_init(void)
|
|||||||
/* Create new lock */
|
/* Create new lock */
|
||||||
tss_sym_table_lock = (CRYPTO_RWLOCK *)CRYPTO_THREAD_lock_new();
|
tss_sym_table_lock = (CRYPTO_RWLOCK *)CRYPTO_THREAD_lock_new();
|
||||||
|
|
||||||
|
/* Attach cleanup routine to task delete hook chain */
|
||||||
|
taskDeleteHookAdd((FUNCPTR)tss_symlist_task_cleanup_hook);
|
||||||
|
|
||||||
g_tss_sym_initialized = 1;
|
g_tss_sym_initialized = 1;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -268,8 +316,11 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
|
|||||||
/* Acquire lock */
|
/* Acquire lock */
|
||||||
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
|
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
|
||||||
|
|
||||||
int result = tss_symlist_add_new_internal(taskId, run_once_arg_str,
|
tss_entry_t *tmp_entry = (tss_entry_t*)(*key);
|
||||||
tss_key_name, key, TSS_SYMLIST_STATE_ADDED, FALSE);
|
|
||||||
|
int result = tss_symlist_add_new_internal(taskId, run_once_arg_str, tss_key_name,
|
||||||
|
key, TSS_SYMLIST_STATE_ADDED, FALSE,
|
||||||
|
tmp_entry ? tmp_entry->dtor : NULL);
|
||||||
|
|
||||||
/* Add this entry to the clone list if it isn't already added */
|
/* Add this entry to the clone list if it isn't already added */
|
||||||
if (result == OK) {
|
if (result == OK) {
|
||||||
@@ -278,6 +329,7 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
|
|||||||
strncpy(tmp.run_once_arg_str, run_once_arg_str, MAX_STR_LEN - 1);
|
strncpy(tmp.run_once_arg_str, run_once_arg_str, MAX_STR_LEN - 1);
|
||||||
strncpy(tmp.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
|
strncpy(tmp.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
|
||||||
tmp.tss_key = key;
|
tmp.tss_key = key;
|
||||||
|
tmp.dtor = tmp_entry ? tmp_entry->dtor : NULL;
|
||||||
tss_clone_list_add(&tmp);
|
tss_clone_list_add(&tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +341,9 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
|
|||||||
|
|
||||||
/* Create entry and update the global key (thread_local) for the current task */
|
/* Create entry and update the global key (thread_local) for the current task */
|
||||||
static int
|
static int
|
||||||
tss_create_and_update_table(tss_t *key, char *tss_key_name, char *run_once_arg_str)
|
tss_create_and_update_table(tss_t *key, char *tss_key_name,
|
||||||
|
char *run_once_arg_str,
|
||||||
|
void (*dtor)(void *))
|
||||||
{
|
{
|
||||||
tss_entry_t *entry;
|
tss_entry_t *entry;
|
||||||
TASK_ID selfTaskId;
|
TASK_ID selfTaskId;
|
||||||
@@ -318,7 +372,8 @@ tss_create_and_update_table(tss_t *key, char *tss_key_name, char *run_once_arg_s
|
|||||||
|
|
||||||
/* Add to symbol table for tracking */
|
/* Add to symbol table for tracking */
|
||||||
int result = tss_symlist_add_new_internal(selfTaskId, run_once_arg_str,
|
int result = tss_symlist_add_new_internal(selfTaskId, run_once_arg_str,
|
||||||
tss_key_name, key, TSS_SYMLIST_STATE_ADDED, TRUE);
|
tss_key_name, key, TSS_SYMLIST_STATE_ADDED,
|
||||||
|
TRUE, dtor);
|
||||||
|
|
||||||
if (result != OK) {
|
if (result != OK) {
|
||||||
/* Rollback on failure */
|
/* Rollback on failure */
|
||||||
@@ -336,7 +391,8 @@ static int
|
|||||||
tss_symlist_check_and_clone(TASK_ID tid,
|
tss_symlist_check_and_clone(TASK_ID tid,
|
||||||
const char *tss_key_name,
|
const char *tss_key_name,
|
||||||
const char *run_once_arg_str,
|
const char *run_once_arg_str,
|
||||||
tss_t *key)
|
tss_t *key,
|
||||||
|
void (*dtor)(void *))
|
||||||
{
|
{
|
||||||
int idx;
|
int idx;
|
||||||
/* First, check if entry already exists in the symbol table */
|
/* First, check if entry already exists in the symbol table */
|
||||||
@@ -355,7 +411,8 @@ tss_symlist_check_and_clone(TASK_ID tid,
|
|||||||
/* Not found, clone entry - lock already held by caller */
|
/* Not found, clone entry - lock already held by caller */
|
||||||
return tss_create_and_update_table(key,
|
return tss_create_and_update_table(key,
|
||||||
(char *)tss_key_name,
|
(char *)tss_key_name,
|
||||||
(char *)run_once_arg_str);
|
(char *)run_once_arg_str,
|
||||||
|
dtor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clone missing entries for a new task */
|
/* Clone missing entries for a new task */
|
||||||
@@ -388,7 +445,8 @@ tss_symlist_clone_entries_for_new_task(char *run_once_arg_string)
|
|||||||
int result = tss_symlist_check_and_clone(current_tid,
|
int result = tss_symlist_check_and_clone(current_tid,
|
||||||
tss_clone_list[i].tss_key_name,
|
tss_clone_list[i].tss_key_name,
|
||||||
tss_clone_list[i].run_once_arg_str,
|
tss_clone_list[i].run_once_arg_str,
|
||||||
tss_clone_list[i].tss_key);
|
tss_clone_list[i].tss_key,
|
||||||
|
tss_clone_list[i].dtor);
|
||||||
}
|
}
|
||||||
|
|
||||||
CRYPTO_THREAD_unlock(tss_sym_table_lock);
|
CRYPTO_THREAD_unlock(tss_sym_table_lock);
|
||||||
@@ -412,21 +470,28 @@ tss_sym_deinit(void)
|
|||||||
/* Acquire write lock before tearing down */
|
/* Acquire write lock before tearing down */
|
||||||
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
|
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
|
||||||
|
|
||||||
|
/* Remove cleanup hook from task delete chain */
|
||||||
|
taskDeleteHookDelete((FUNCPTR)tss_symlist_task_cleanup_hook);
|
||||||
|
|
||||||
/* Free any remaining per-task entries in the symbol table */
|
/* Free any remaining per-task entries in the symbol table */
|
||||||
for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) {
|
for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) {
|
||||||
if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID)
|
if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tss_sym_table[i].info.tss_key) {
|
tss_t *thread_local_ptr = tss_sym_table[i].info.tss_key;
|
||||||
tss_entry_t *entry = (tss_entry_t *)(*tss_sym_table[i].info.tss_key);
|
tss_entry_t *entry = NULL;
|
||||||
if (entry) {
|
|
||||||
if (entry->dtor)
|
if (thread_local_ptr) {
|
||||||
entry->dtor(entry->var);
|
entry = (tss_entry_t *)(*thread_local_ptr);
|
||||||
free(entry);
|
/* Clear the global key for this task immediately */
|
||||||
*tss_sym_table[i].info.tss_key = (tss_t)0; /* clear per-task slot */
|
*thread_local_ptr = (tss_t)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry) {
|
||||||
|
if (entry->var && tss_sym_table[i].info.dtor) {
|
||||||
|
tss_sym_table[i].info.dtor(entry->var);
|
||||||
}
|
}
|
||||||
/* Clear the stored pointer to the key variable itself */
|
free(entry);
|
||||||
tss_sym_table[i].info.tss_key = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the table slot */
|
/* Clear the table slot */
|
||||||
@@ -436,8 +501,6 @@ tss_sym_deinit(void)
|
|||||||
|
|
||||||
/* Clear clone list entries */
|
/* Clear clone list entries */
|
||||||
for (i = 0; i < MAX_CLONE_ENTRIES; i++) {
|
for (i = 0; i < MAX_CLONE_ENTRIES; i++) {
|
||||||
if (tss_clone_list[i].tss_key == NULL)
|
|
||||||
continue;
|
|
||||||
memset(&tss_clone_list[i], 0, sizeof(tss_sym_info));
|
memset(&tss_clone_list[i], 0, sizeof(tss_sym_info));
|
||||||
tss_clone_list[i].tss_key = NULL;
|
tss_clone_list[i].tss_key = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user