summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2016-06-04 14:49:48 +0200
committerJustus Winter <justus@gnupg.org>2016-06-04 14:49:48 +0200
commitd6c3ccec5256a26355651d93f8732ac14d3a02a6 (patch)
tree77e24d43882713ddb0736ab8b68aa57dd261dc64
parent4085995d5c2cf07c932af1a2ab69b1594a879912 (diff)
add patch series
-rw-r--r--debian/patches/corefiles0001-trans-crash-fix-resource-leaks.patch55
-rw-r--r--debian/patches/corefiles0002-trans-crash-xxx-core-file-templates.patch245
-rw-r--r--debian/patches/series2
3 files changed, 302 insertions, 0 deletions
diff --git a/debian/patches/corefiles0001-trans-crash-fix-resource-leaks.patch b/debian/patches/corefiles0001-trans-crash-fix-resource-leaks.patch
new file mode 100644
index 00000000..79baca58
--- /dev/null
+++ b/debian/patches/corefiles0001-trans-crash-fix-resource-leaks.patch
@@ -0,0 +1,55 @@
+From 16b91e459e52b985d32ff3f6280fafe59dc3aa80 Mon Sep 17 00:00:00 2001
+From: Justus Winter <justus@gnupg.org>
+Date: Fri, 3 Jun 2016 16:55:55 +0200
+Subject: [PATCH hurd 1/2] trans/crash: fix resource leaks
+
+* trans/crash.c (S_crash_dump_task): Properly deallocate 'task',
+'core_file', and 'ctty_id'.
+---
+ trans/crash.c | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/trans/crash.c b/trans/crash.c
+index 5db9974..e60ce7e 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;
+--
+2.1.4
+
diff --git a/debian/patches/corefiles0002-trans-crash-xxx-core-file-templates.patch b/debian/patches/corefiles0002-trans-crash-xxx-core-file-templates.patch
new file mode 100644
index 00000000..7f2922ed
--- /dev/null
+++ b/debian/patches/corefiles0002-trans-crash-xxx-core-file-templates.patch
@@ -0,0 +1,245 @@
+From 647834f82039e395acbb948fb2778ba799fa640d Mon Sep 17 00:00:00 2001
+From: Justus Winter <justus@gnupg.org>
+Date: Fri, 3 Jun 2016 00:52:06 +0200
+Subject: [PATCH hurd 2/2] trans/crash: xxx core file templates
+
+---
+ hurd/crash.defs | 6 +-
+ trans/crash.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 168 insertions(+), 4 deletions(-)
+
+diff --git a/hurd/crash.defs b/hurd/crash.defs
+index 442957d..aead8ee 100644
+--- a/hurd/crash.defs
++++ b/hurd/crash.defs
+@@ -25,8 +25,10 @@ subsystem crash 32000;
+
+ /* Handle a crashing task, whose task control port is TASK.
+
+- FILE is a file port open for writing. The caller will link it to "core"
+- (or whatever name) if the RPC returns success.
++ FILE is a file port open for writing. The caller will link it to
++ "core" (or whatever name) if the RPC returns success. If EEXIST is
++ returned, the caller assumes that a core file has been written to a
++ different file, and that FILE can be discarded.
+
+ SIGNO, SIGCODE, and SIGERROR indicate the signal that killed the
+ process. EXC is zero for a software signal; otherwise EXC, CODE, and
+diff --git a/trans/crash.c b/trans/crash.c
+index e60ce7e..0fe9b24 100644
+--- a/trans/crash.c
++++ b/trans/crash.c
+@@ -70,7 +70,105 @@ enum crash_action
+ #define CRASH_ORPHANS_DEFAULT crash_corefile
+
+ static enum crash_action crash_how, crash_orphans_how;
++static char *corefile_template;
+
++
++
++/* Template parsing. */
++static int
++template_valid (const char *template, const char **errp)
++{
++ int valid = 0;
++ const char *t;
++ int specifier = 0;
++
++ for (t = template; *t; t++)
++ {
++ if (specifier)
++ switch (*t)
++ {
++ case '%':
++ case 'p':
++ case 's':
++ case 't':
++ specifier = 0;
++ break;
++ default:
++ goto out;
++ }
++ else if (*t == '%')
++ specifier = 1;
++ }
++
++ out:
++ valid = ! specifier;
++ *errp = valid? NULL: t;
++ return valid;
++}
++
++static char *
++template_make_file_name (const char *template,
++ task_t task,
++ int signo)
++{
++ const char *t;
++ char *file_name = NULL;
++ size_t file_name_len = 0;
++ FILE *stream;
++ int specifier = 0;
++
++ if (! template_valid (template, &t))
++ {
++ errno = EINVAL;
++ return NULL;
++ }
++
++ stream = open_memstream (&file_name, &file_name_len);
++ if (stream == NULL)
++ return NULL;
++
++ for (t = template; *t; t++)
++ {
++ if (specifier)
++ {
++ switch (*t)
++ {
++ case '%':
++ fprintf (stream, "%%");
++ break;
++
++ case 'p':
++ fprintf (stream, "%d", task2pid (task));
++ break;
++
++ case 's':
++ fprintf (stream, "%d", signo);
++ break;
++
++ case 't':
++ fprintf (stream, "%d", time (NULL));
++ break;
++
++ default:
++ assert (!"reached!");
++ }
++ specifier = 0;
++ }
++ else if (*t == '%')
++ specifier = 1;
++ else
++ fprintf (stream, "%c", *t);
++ }
++
++ assert (! specifier);
++
++ fprintf (stream, "%c", 0);
++ fclose (stream);
++
++ return file_name;
++}
++
++
+
+ /* This is defined in ../exec/elfcore.c, or we could have
+ different implementations for other formats. */
+@@ -237,10 +335,42 @@ S_crash_dump_task (mach_port_t port,
+ err = task_suspend (task);
+ if (!err)
+ {
+- err = dump_core (task, core_file,
++ file_t sink = core_file;
++ if (corefile_template)
++ {
++ char *file_name;
++
++ file_name = template_make_file_name (corefile_template,
++ task, signo);
++ if (file_name == NULL)
++ error (0, errno, "template_make_file_name");
++ else
++ {
++ sink = file_name_lookup (file_name, O_WRONLY|O_CREAT,
++ S_IRUSR);
++ if (! MACH_PORT_VALID (sink))
++ {
++ error (0, errno, "%s", file_name);
++ sink = core_file;
++ }
++ free (file_name);
++ }
++ }
++
++ err = dump_core (task, sink,
+ (off_t) -1, /* XXX should get core limit in RPC */
+ signo, sigcode, sigerror);
+ task_resume (task);
++
++ if (sink != core_file)
++ {
++ mach_port_deallocate (mach_task_self (), sink);
++
++ /* We return an error so that the libc discards
++ CORE_FILE. */
++ if (! err)
++ err = EEXIST;
++ }
+ }
+ break;
+
+@@ -450,13 +580,25 @@ static const struct argp_option options[] =
+ {"kill", 'k', 0, 0, "Kill the process", 2},
+ {"core-file", 'c', 0, 0, "Dump a core file", 2},
+ {"dump-core", 0, 0, OPTION_ALIAS },
++ {"core-file-name", 'C', "TEMPLATE", 0,
++ "Specify core file name (see below)", 2},
+ {0}
+ };
+ static const char doc[] =
+ "Server to handle crashing tasks and dump core files or equivalent.\v"
+ "The ACTION values can be `suspend', `kill', or `core-file'.\n\n"
+ "If `--orphan-action' is not specified, the `--action' value is used for "
+-"orphans. The default is `--action=suspend --orphan-action=core-file'.";
++"orphans. The default is `--action=suspend --orphan-action=core-file'.\n"
++"\n"
++"The core file is either written to the file provided by the "
++"crashing process, or if a TEMPLATE value is given, to the file "
++"with the name constructed by expanding TEMPLATE value. "
++"TEMPLATE may contain % specifiers:\n"
++"\n"
++"\t%% just %\n"
++"\t%p the process' PID\n"
++"\t%s the signal number that caused the dump\n"
++"\t%t time of crash in seconds since the EPOCH\n";
+
+ static error_t
+ parse_opt (int opt, char *arg, struct argp_state *state)
+@@ -494,6 +636,14 @@ parse_opt (int opt, char *arg, struct argp_state *state)
+ case 's': crash_how = crash_suspend; break;
+ case 'k': crash_how = crash_kill; break;
+ case 'c': crash_how = crash_corefile; break;
++ case 'C':
++ {
++ char *errp;
++ if (! template_valid (arg, &errp))
++ error (1, 0, "Invalid template: ...'%s'", errp);
++ }
++ corefile_template = arg;
++ break;
+
+ case ARGP_KEY_SUCCESS:
+ if (crash_orphans_how == crash_unspecified)
+@@ -536,6 +686,18 @@ trivfs_append_args (struct trivfs_control *fsys,
+ err = argz_add (argz, argz_len, opt);
+ }
+
++ if (!err && corefile_template)
++ {
++ char *template;
++ if (asprintf (&template, "--core-file-name=%s", corefile_template) < 0)
++ err = errno;
++ else
++ {
++ err = argz_add (argz, argz_len, template);
++ free (template);
++ }
++ }
++
+ return err;
+ }
+
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 563f1d69..296fd4ec 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -42,3 +42,5 @@ crash0001-xxx-crash-logging-works.patch
nfs0001-nfs-fix-memory-leak.patch
leaks0001-xxx-print-fail.patch
leaks0002-libshouldbeinlibc-add-safe-port-handling-macros.patch
+corefiles0001-trans-crash-fix-resource-leaks.patch
+corefiles0002-trans-crash-xxx-core-file-templates.patch