summaryrefslogtreecommitdiff
path: root/trans
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2016-06-03 16:55:55 +0200
committerJustus Winter <justus@gnupg.org>2016-06-04 16:12:27 +0200
commita8b8ece4ff36fca27492f0a4e925e2f4453ee483 (patch)
treef14b7a850092317806c5e1df716fba2d985bb55a /trans
parentdd93fc4bfbaceb65ded2aefca35042438c95f4d5 (diff)
trans/crash: fix resource leaks
Previously, 'task', 'core_file', and 'ctty_id' were not deallocated if crash was configured to write core files, and 'ctty_id' was leaked if the crashing task was suspended. This lead to resources not being released in the kernel, the filesystem, and the terminal subsystem, and could very well be responsible for making the Debian/Hurd shutdown hang. * trans/crash.c (S_crash_dump_task): Properly deallocate 'task', 'core_file', and 'ctty_id'.
Diffstat (limited to 'trans')
-rw-r--r--trans/crash.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/trans/crash.c b/trans/crash.c
index 5db99743..e60ce7ee 100644
--- a/trans/crash.c
+++ b/trans/crash.c
@@ -217,7 +217,9 @@ S_crash_dump_task (mach_port_t port,
proc_mark_stop (user_proc, signo, sigcode);
c->task = task;
+ task = MACH_PORT_NULL;
c->core_file = core_file;
+ core_file = MACH_PORT_NULL;
c->core_limit = (off_t) -1; /* XXX should core limit in RPC */
c->signo = signo;
c->sigcode = sigcode;
@@ -251,17 +253,20 @@ S_crash_dump_task (mach_port_t port,
if (!err)
err = proc_mark_exit (user_proc, W_EXITCODE (0, signo), sigcode);
err = task_terminate (task);
- if (!err)
- {
- mach_port_deallocate (mach_task_self (), task);
- mach_port_deallocate (mach_task_self (), core_file);
- mach_port_deallocate (mach_task_self (), ctty_id);
- }
}
}
if (user_proc != MACH_PORT_NULL)
mach_port_deallocate (mach_task_self (), user_proc);
+ if (err == 0 || err = MIG_NO_REPLY)
+ {
+ if (MACH_PORT_VALID (task))
+ mach_port_deallocate (mach_task_self (), task);
+ if (MACH_PORT_VALID (core_file))
+ mach_port_deallocate (mach_task_self (), core_file);
+ if (MACH_PORT_VALID (ctty_id))
+ mach_port_deallocate (mach_task_self (), ctty_id);
+ }
ports_port_deref (cred);
return err;