Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -1649,15 +1649,26 @@ static int cn_printf(struct core_name *cn, const char *fmt, ...)
	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;