Browse Source

RTOS: Unify wipe-out of thread list

Each RTOS implementation uses it's own (similar) code to free
the thread list. There are some additional issues:

<--->
if (pointer != NULL)
	free(pointer);
<--->
This is not necessary, free(NULL) is perfectly ok.

<--->
free(rtos->thread_details);
rtos->thread_details = NULL;
rtos->thread_count = 0;
<--->
The 3rd line has been missing for all RTOS but ChibiOs. There are paths
in the code where rtos->thread_count is never set to NULL, which can
lead to null pointer dereference of rtos->thread_details.

Change-Id: I6f7045c3d4518b925cb80dd5c907a566536b34ad
Signed-off-by: Christian Eggers <ceggers@gmx.de>
---
Changelog:
v7:
- rtos_wipe_threadlist() --> rtos_free_threadlist()
- removed non related changes in gdb_server.c from this patch
v3:
- Removed world "topic" from first line of commit message
v2:
- typo: "whipe" --> "wipe"
Reviewed-on: http://openocd.zylin.com/1916
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
tags/v0.8.0-rc1
Christian Eggers 10 years ago
committed by Spencer Oliver
parent
commit
d36889e692
7 changed files with 24 additions and 91 deletions
  1. +2
    -15
      src/rtos/ChibiOS.c
  2. +1
    -19
      src/rtos/FreeRTOS.c
  3. +1
    -19
      src/rtos/ThreadX.c
  4. +1
    -19
      src/rtos/eCos.c
  5. +1
    -19
      src/rtos/embKernel.c
  6. +17
    -0
      src/rtos/rtos.c
  7. +1
    -0
      src/rtos/rtos.h

+ 2
- 15
src/rtos/ChibiOS.c View File

@@ -296,21 +296,8 @@ static int ChibiOS_update_threads(struct rtos *rtos)
}

/* wipe out previous thread details if any */
int j;
if (rtos->thread_details) {
for (j = 0; j < rtos->thread_count; j++) {
struct thread_detail *current_thread = &rtos->thread_details[j];
if (current_thread->display_str != NULL)
free(current_thread->display_str);
if (current_thread->thread_name_str != NULL)
free(current_thread->thread_name_str);
if (current_thread->extra_info_str != NULL)
free(current_thread->extra_info_str);
}
free(rtos->thread_details);
rtos->thread_details = NULL;
rtos->thread_count = 0;
}
rtos_free_threadlist(rtos);

/* ChibiOS does not save the current thread count. We have to first
* parse the double linked thread list to check for errors and the number of
* threads. */


+ 1
- 19
src/rtos/FreeRTOS.c View File

@@ -173,25 +173,7 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
}

/* wipe out previous thread details if any */
if (rtos->thread_details != NULL) {
int j;
for (j = 0; j < rtos->thread_count; j++) {
if (rtos->thread_details[j].display_str != NULL) {
free(rtos->thread_details[j].display_str);
rtos->thread_details[j].display_str = NULL;
}
if (rtos->thread_details[j].thread_name_str != NULL) {
free(rtos->thread_details[j].thread_name_str);
rtos->thread_details[j].thread_name_str = NULL;
}
if (rtos->thread_details[j].extra_info_str != NULL) {
free(rtos->thread_details[j].extra_info_str);
rtos->thread_details[j].extra_info_str = NULL;
}
}
free(rtos->thread_details);
rtos->thread_details = NULL;
}
rtos_free_threadlist(rtos);

/* read the current thread */
retval = target_read_buffer(rtos->target,


+ 1
- 19
src/rtos/ThreadX.c View File

@@ -155,25 +155,7 @@ static int ThreadX_update_threads(struct rtos *rtos)
}

/* wipe out previous thread details if any */
if (rtos->thread_details != NULL) {
int j;
for (j = 0; j < rtos->thread_count; j++) {
if (rtos->thread_details[j].display_str != NULL) {
free(rtos->thread_details[j].display_str);
rtos->thread_details[j].display_str = NULL;
}
if (rtos->thread_details[j].thread_name_str != NULL) {
free(rtos->thread_details[j].thread_name_str);
rtos->thread_details[j].thread_name_str = NULL;
}
if (rtos->thread_details[j].extra_info_str != NULL) {
free(rtos->thread_details[j].extra_info_str);
rtos->thread_details[j].extra_info_str = NULL;
}
}
free(rtos->thread_details);
rtos->thread_details = NULL;
}
rtos_free_threadlist(rtos);

/* read the current thread id */
retval = target_read_buffer(rtos->target,


+ 1
- 19
src/rtos/eCos.c View File

@@ -125,25 +125,7 @@ static int eCos_update_threads(struct rtos *rtos)
}

/* wipe out previous thread details if any */
if (rtos->thread_details != NULL) {
int j;
for (j = 0; j < rtos->thread_count; j++) {
if (rtos->thread_details[j].display_str != NULL) {
free(rtos->thread_details[j].display_str);
rtos->thread_details[j].display_str = NULL;
}
if (rtos->thread_details[j].thread_name_str != NULL) {
free(rtos->thread_details[j].thread_name_str);
rtos->thread_details[j].thread_name_str = NULL;
}
if (rtos->thread_details[j].extra_info_str != NULL) {
free(rtos->thread_details[j].extra_info_str);
rtos->thread_details[j].extra_info_str = NULL;
}
}
free(rtos->thread_details);
rtos->thread_details = NULL;
}
rtos_free_threadlist(rtos);

/* determine the number of current threads */
uint32_t thread_list_head = rtos->symbols[eCos_VAL_thread_list].address;


+ 1
- 19
src/rtos/embKernel.c View File

@@ -206,25 +206,7 @@ static int embKernel_update_threads(struct rtos *rtos)
}

/* wipe out previous thread details if any */
if (rtos->thread_details != NULL) {
int j;
for (j = 0; j < rtos->thread_count; j++) {
if (rtos->thread_details[j].display_str != NULL) {
free(rtos->thread_details[j].display_str);
rtos->thread_details[j].display_str = NULL;
}
if (rtos->thread_details[j].thread_name_str != NULL) {
free(rtos->thread_details[j].thread_name_str);
rtos->thread_details[j].thread_name_str = NULL;
}
if (rtos->thread_details[j].extra_info_str != NULL) {
free(rtos->thread_details[j].extra_info_str);
rtos->thread_details[j].extra_info_str = NULL;
}
}
free(rtos->thread_details);
rtos->thread_details = NULL;
}
rtos_free_threadlist(rtos);

param = (const struct embKernel_params *) rtos->rtos_specific_params;



+ 17
- 0
src/rtos/rtos.c View File

@@ -513,3 +513,20 @@ int rtos_update_threads(struct target *target)
target->rtos->type->update_threads(target->rtos);
return ERROR_OK;
}

void rtos_free_threadlist(struct rtos *rtos)
{
if (rtos->thread_details) {
int j;

for (j = 0; j < rtos->thread_count; j++) {
struct thread_detail *current_thread = &rtos->thread_details[j];
free(current_thread->display_str);
free(current_thread->thread_name_str);
free(current_thread->extra_info_str);
}
free(rtos->thread_details);
rtos->thread_details = NULL;
rtos->thread_count = 0;
}
}

+ 1
- 0
src/rtos/rtos.h View File

@@ -98,6 +98,7 @@ int rtos_try_next(struct target *target);
int gdb_thread_packet(struct connection *connection, char *packet, int packet_size);
int rtos_get_gdb_reg_list(struct connection *connection);
int rtos_update_threads(struct target *target);
void rtos_free_threadlist(struct rtos *rtos);
int rtos_smp_init(struct target *target);
/* function for handling symbol access */
int rtos_qsymbol(struct connection *connection, char *packet, int packet_size);


Loading…
Cancel
Save