From 680b258e4eff815a204473483054b5a086a92427 Mon Sep 17 00:00:00 2001 From: Subham Gangdeb Date: Tue, 23 Jun 2026 07:10:56 +0000 Subject: [PATCH] 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 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 Reviewed-on: http://13.234.246.121:3000/Neominds/ossl35vx69/pulls/69 Co-authored-by: Subham Gangdeb Co-committed-by: Subham Gangdeb --- vxworks-6.9/target/src/os/vxtss_symlist.c | 101 ++++++++++++++++++---- 1 file changed, 82 insertions(+), 19 deletions(-) diff --git a/vxworks-6.9/target/src/os/vxtss_symlist.c b/vxworks-6.9/target/src/os/vxtss_symlist.c index 4e3c48b3..20038198 100644 --- a/vxworks-6.9/target/src/os/vxtss_symlist.c +++ b/vxworks-6.9/target/src/os/vxtss_symlist.c @@ -17,6 +17,7 @@ typedef struct { char run_once_arg_str[MAX_STR_LEN]; char tss_key_name[MAX_STR_LEN]; tss_t *tss_key; + void (*dtor)(void *); } tss_sym_info; /* Sym table entry */ @@ -202,7 +203,8 @@ tss_symlist_add_new_internal(TASK_ID taskId, char *tss_key_name, tss_t *key, tss_sym_state state, - int cloned) + int cloned, + void (*dtor)(void *)) { 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); 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.dtor = dtor; tss_sym_table[idx].state = state; tss_sym_table[idx].cloned = cloned; 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 */ int tss_sym_init(void) @@ -247,6 +292,9 @@ tss_sym_init(void) /* Create new lock */ 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; return OK; @@ -268,8 +316,11 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name, /* Acquire lock */ CRYPTO_THREAD_write_lock(tss_sym_table_lock); - int result = tss_symlist_add_new_internal(taskId, run_once_arg_str, - tss_key_name, key, TSS_SYMLIST_STATE_ADDED, FALSE); + tss_entry_t *tmp_entry = (tss_entry_t*)(*key); + + 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 */ 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.tss_key_name, tss_key_name, MAX_STR_LEN - 1); tmp.tss_key = key; + tmp.dtor = tmp_entry ? tmp_entry->dtor : NULL; 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 */ 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; 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 */ 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) { /* Rollback on failure */ @@ -336,7 +391,8 @@ static int tss_symlist_check_and_clone(TASK_ID tid, const char *tss_key_name, const char *run_once_arg_str, - tss_t *key) + tss_t *key, + void (*dtor)(void *)) { int idx; /* 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 */ return tss_create_and_update_table(key, (char *)tss_key_name, - (char *)run_once_arg_str); + (char *)run_once_arg_str, + dtor); } /* 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, tss_clone_list[i].tss_key_name, 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); @@ -412,21 +470,28 @@ tss_sym_deinit(void) /* Acquire write lock before tearing down */ 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 */ for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) { if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID) continue; - if (tss_sym_table[i].info.tss_key) { - tss_entry_t *entry = (tss_entry_t *)(*tss_sym_table[i].info.tss_key); - if (entry) { - if (entry->dtor) - entry->dtor(entry->var); - free(entry); - *tss_sym_table[i].info.tss_key = (tss_t)0; /* clear per-task slot */ + tss_t *thread_local_ptr = tss_sym_table[i].info.tss_key; + tss_entry_t *entry = NULL; + + if (thread_local_ptr) { + entry = (tss_entry_t *)(*thread_local_ptr); + /* Clear the global key for this task immediately */ + *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 */ - tss_sym_table[i].info.tss_key = NULL; + free(entry); } /* Clear the table slot */ @@ -436,8 +501,6 @@ tss_sym_deinit(void) /* Clear clone list entries */ 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)); tss_clone_list[i].tss_key = NULL; }