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: Jiri 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3141c8b165
commit
2c563731fe
31
fs/exec.c
31
fs/exec.c
@ -1649,15 +1649,26 @@ expand_fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cn_escape(char *str)
|
||||
{
|
||||
for (; *str; str++)
|
||||
if (*str == '/')
|
||||
*str = '!';
|
||||
}
|
||||
|
||||
static int cn_print_exe_file(struct core_name *cn)
|
||||
{
|
||||
struct file *exe_file;
|
||||
char *pathbuf, *path, *p;
|
||||
char *pathbuf, *path;
|
||||
int ret;
|
||||
|
||||
exe_file = get_mm_exe_file(current->mm);
|
||||
if (!exe_file)
|
||||
return cn_printf(cn, "%s (path unknown)", current->comm);
|
||||
if (!exe_file) {
|
||||
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);
|
||||
if (!pathbuf) {
|
||||
@ -1671,9 +1682,7 @@ static int cn_print_exe_file(struct core_name *cn)
|
||||
goto free_buf;
|
||||
}
|
||||
|
||||
for (p = path; *p; p++)
|
||||
if (*p == '/')
|
||||
*p = '!';
|
||||
cn_escape(path);
|
||||
|
||||
ret = cn_printf(cn, "%s", path);
|
||||
|
||||
@ -1745,16 +1754,22 @@ static int format_corename(struct core_name *cn, long signr)
|
||||
break;
|
||||
}
|
||||
/* hostname */
|
||||
case 'h':
|
||||
case 'h': {
|
||||
char *namestart = cn->corename + cn->used;
|
||||
down_read(&uts_sem);
|
||||
err = cn_printf(cn, "%s",
|
||||
utsname()->nodename);
|
||||
up_read(&uts_sem);
|
||||
cn_escape(namestart);
|
||||
break;
|
||||
}
|
||||
/* executable */
|
||||
case 'e':
|
||||
case 'e': {
|
||||
char *commstart = cn->corename + cn->used;
|
||||
err = cn_printf(cn, "%s", current->comm);
|
||||
cn_escape(commstart);
|
||||
break;
|
||||
}
|
||||
case 'E':
|
||||
err = cn_print_exe_file(cn);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user