From 5091eb23aa99df6443dc559d2da403ba7a24c406 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Thu, 30 Apr 2009 18:35:55 +0000 Subject: [PATCH] * inferiors.c (remove_process): Fix memory leak, free process. * linux-low.c (linux_remove_process): New function. (linux_kill): Call it instead of remove_process. (linux_detach, linux_wait_1): Ditto. --- gdb/gdbserver/ChangeLog | 7 +++++++ gdb/gdbserver/inferiors.c | 5 +++++ gdb/gdbserver/linux-low.c | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 8d4e2f288e3..a731bfff2e5 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2009-04-30 Doug Evans + + * inferiors.c (remove_process): Fix memory leak, free process. + * linux-low.c (linux_remove_process): New function. + (linux_kill): Call it instead of remove_process. + (linux_detach, linux_wait_1): Ditto. + 2009-04-19 Danny Backx * configure.srv: Add x86 Windows CE target. diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index f96438ef536..8d44d0160a2 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -427,12 +427,17 @@ add_process (int pid, int attached) return process; } +/* Remove a process from the common process list and free the memory + allocated for it. + The caller is responsible for freeing private data first. */ + void remove_process (struct process_info *process) { clear_symbol_cache (&process->symbol_cache); free_all_breakpoints (process); remove_inferior (&all_processes, &process->head); + free (process); } struct process_info * diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index cb6b1b47df0..a6bad392c09 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -182,6 +182,16 @@ linux_add_process (int pid, int attached) return proc; } +/* Remove a process from the common process list, + also freeing all private data. */ + +static void +linux_remove_process (struct process_info *process) +{ + free (process->private); + remove_process (process); +} + /* Handle a GNU/Linux extended wait response. If we see a clone event, we need to add the new LWP to our list (and not report the trap to higher layers). */ @@ -565,7 +575,7 @@ linux_kill (int pid) } while (lwpid > 0 && WIFSTOPPED (wstat)); delete_lwp (lwp); - remove_process (process); + linux_remove_process (process); return 0; } @@ -654,7 +664,7 @@ linux_detach (int pid) delete_all_breakpoints (); find_inferior (&all_threads, linux_detach_one_lwp, &pid); - remove_process (process); + linux_remove_process (process); return 0; } @@ -1273,7 +1283,7 @@ retry: struct process_info *process = find_process_pid (pid); delete_lwp (lwp); - remove_process (process); + linux_remove_process (process); current_inferior = NULL; -- 2.39.2