aboutsummaryrefslogtreecommitdiff
path: root/src/rtos/FreeRTOS.c
diff options
context:
space:
mode:
authorPaul Fertser <fercerpav@gmail.com>2012-03-14 09:24:22 +0300
committerSpencer Oliver <spen@spen-soft.co.uk>2012-03-19 17:07:26 +0000
commitfe11baeebb4e238d4bdc47382edb68d3b4156fd3 (patch)
tree3564f9ff7d48d4d77d3cd07c1cad18ddcdea05eb /src/rtos/FreeRTOS.c
parent7151398cff16129764c79038a2701322f62da883 (diff)
downloadriscv-openocd-fe11baeebb4e238d4bdc47382edb68d3b4156fd3.zip
riscv-openocd-fe11baeebb4e238d4bdc47382edb68d3b4156fd3.tar.gz
riscv-openocd-fe11baeebb4e238d4bdc47382edb68d3b4156fd3.tar.bz2
rtos: fix segfault in FreeRTOS handling
When gdb loads an elf file of a newer or older version of the firmware being debugged, or when the firmware is not running yet, there's a high probability of FreeRTOS variables to be read incorrectly, thus leading to an attempt to allocate an enourmous amount of memory. Without this check OpenOCD simply crashes and that's mad confusing. Change-Id: I404a072e886d2d47d9d942cfaea8417eb8bd4a5d Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-on: http://openocd.zylin.com/520 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/rtos/FreeRTOS.c')
-rw-r--r--src/rtos/FreeRTOS.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/rtos/FreeRTOS.c b/src/rtos/FreeRTOS.c
index c7b4643..2c47917 100644
--- a/src/rtos/FreeRTOS.c
+++ b/src/rtos/FreeRTOS.c
@@ -187,6 +187,10 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
tasks_found++;
rtos->thread_details = (struct thread_detail *) malloc(
sizeof(struct thread_detail) * thread_list_size);
+ if (!rtos->thread_details) {
+ LOG_ERROR("Error allocating memory for %d threads", thread_list_size);
+ return ERROR_FAIL;
+ }
rtos->thread_details->threadid = 1;
rtos->thread_details->exists = true;
rtos->thread_details->display_str = NULL;
@@ -202,6 +206,10 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
/* create space for new thread details */
rtos->thread_details = (struct thread_detail *) malloc(
sizeof(struct thread_detail) * thread_list_size);
+ if (!rtos->thread_details) {
+ LOG_ERROR("Error allocating memory for %d threads", thread_list_size);
+ return ERROR_FAIL;
+ }
}
/* Find out how many lists are needed to be read from pxReadyTasksLists, */
@@ -216,6 +224,10 @@ static int FreeRTOS_update_threads(struct rtos *rtos)
symbol_address_t *list_of_lists =
(symbol_address_t *)malloc(sizeof(symbol_address_t) *
(max_used_priority+1 + 5));
+ if (!list_of_lists) {
+ LOG_ERROR("Error allocating memory for %" PRId64 " priorities", max_used_priority);
+ return ERROR_FAIL;
+ }
int num_lists;
for (num_lists = 0; num_lists <= max_used_priority; num_lists++)