Commit 2c563731 authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds

coredump: escape / in hostname and comm

Change every occurence of / in comm and hostname to !.  If the process
changes its name to contain /, the core is not dumped (if the directory
tree doesn't exist like that).  The same with hostname being something
like myhost/3.  Fix this behaviour by using the escape loop used in %E.
(We extract it to a separate function.)

Now both with comm == myprocess/1 and hostname == myhost/1, the core is
dumped like (kernel.core_pattern='core.%p.%e.%h):
core.2349.myprocess!1.myhost!1
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andi Kleen <andi@firstfloor.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3141c8b1
...@@ -1649,15 +1649,26 @@ static int cn_printf(struct core_name *cn, const char *fmt, ...) ...@@ -1649,15 +1649,26 @@ static int cn_printf(struct core_name *cn, const char *fmt, ...)
return ret; return ret;
} }
static void cn_escape(char *str)
{
for (; *str; str++)
if (*str == '/')
*str = '!';
}
static int cn_print_exe_file(struct core_name *cn) static int cn_print_exe_file(struct core_name *cn)
{ {
struct file *exe_file; struct file *exe_file;
char *pathbuf, *path, *p; char *pathbuf, *path;
int ret; int ret;
exe_file = get_mm_exe_file(current->mm); exe_file = get_mm_exe_file(current->mm);
if (!exe_file) if (!exe_file) {
return cn_printf(cn, "%s (path unknown)", current->comm); char *commstart = cn->corename + cn->used;
ret = cn_printf(cn, "%s (path unknown)", current->comm);
cn_escape(commstart);
return ret;
}
pathbuf = kmalloc(PATH_MAX, GFP_TEMPORARY); pathbuf = kmalloc(PATH_MAX, GFP_TEMPORARY);
if (!pathbuf) { if (!pathbuf) {
...@@ -1671,9 +1682,7 @@ static int cn_print_exe_file(struct core_name *cn) ...@@ -1671,9 +1682,7 @@ static int cn_print_exe_file(struct core_name *cn)
goto free_buf; goto free_buf;
} }
for (p = path; *p; p++) cn_escape(path);
if (*p == '/')
*p = '!';
ret = cn_printf(cn, "%s", path); ret = cn_printf(cn, "%s", path);
...@@ -1745,16 +1754,22 @@ static int format_corename(struct core_name *cn, long signr) ...@@ -1745,16 +1754,22 @@ static int format_corename(struct core_name *cn, long signr)
break; break;
} }
/* hostname */ /* hostname */
case 'h': case 'h': {
char *namestart = cn->corename + cn->used;
down_read(&uts_sem); down_read(&uts_sem);
err = cn_printf(cn, "%s", err = cn_printf(cn, "%s",
utsname()->nodename); utsname()->nodename);
up_read(&uts_sem); up_read(&uts_sem);
cn_escape(namestart);
break; break;
}
/* executable */ /* executable */
case 'e': case 'e': {
char *commstart = cn->corename + cn->used;
err = cn_printf(cn, "%s", current->comm); err = cn_printf(cn, "%s", current->comm);
cn_escape(commstart);
break; break;
}
case 'E': case 'E':
err = cn_print_exe_file(cn); err = cn_print_exe_file(cn);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment