Commit f38c85f1 authored by Lepton Wu's avatar Lepton Wu Committed by Linus Torvalds

coredump: add %f for executable filename

The document reads "%e" should be "executable filename" while actually it
could be changed by things like pr_ctl PR_SET_NAME.  People who uses "%e"
in core_pattern get surprised when they find out they get thread name
instead of executable filename.

This is either a bug of document or a bug of code.  Since the behavior of
"%e" is there for long time, it could bring another surprise for users if
we "fix" the code.

So we just "fix" the document.  And more, for users who really need the
"executable filename" in core_pattern, we introduce a new "%f" for the
real executable filename.  We already have "%E" for executable path in
kernel, so just reuse most of its code for the new added "%f" format.
Signed-off-by: default avatarLepton Wu <ytht.net@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/20200701031432.2978761-1-ytht.net@gmail.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0776d123
...@@ -164,7 +164,8 @@ core_pattern ...@@ -164,7 +164,8 @@ core_pattern
%s signal number %s signal number
%t UNIX time of dump %t UNIX time of dump
%h hostname %h hostname
%e executable filename (may be shortened) %e executable filename (may be shortened, could be changed by prctl etc)
%f executable filename
%E executable path %E executable path
%c maximum size of core file by resource limit RLIMIT_CORE %c maximum size of core file by resource limit RLIMIT_CORE
%<OTHER> both are dropped %<OTHER> both are dropped
......
...@@ -153,10 +153,10 @@ int cn_esc_printf(struct core_name *cn, const char *fmt, ...) ...@@ -153,10 +153,10 @@ int cn_esc_printf(struct core_name *cn, const char *fmt, ...)
return ret; return ret;
} }
static int cn_print_exe_file(struct core_name *cn) static int cn_print_exe_file(struct core_name *cn, bool name_only)
{ {
struct file *exe_file; struct file *exe_file;
char *pathbuf, *path; char *pathbuf, *path, *ptr;
int ret; int ret;
exe_file = get_mm_exe_file(current->mm); exe_file = get_mm_exe_file(current->mm);
...@@ -175,6 +175,11 @@ static int cn_print_exe_file(struct core_name *cn) ...@@ -175,6 +175,11 @@ static int cn_print_exe_file(struct core_name *cn)
goto free_buf; goto free_buf;
} }
if (name_only) {
ptr = strrchr(path, '/');
if (ptr)
path = ptr + 1;
}
ret = cn_esc_printf(cn, "%s", path); ret = cn_esc_printf(cn, "%s", path);
free_buf: free_buf:
...@@ -301,12 +306,16 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm, ...@@ -301,12 +306,16 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
utsname()->nodename); utsname()->nodename);
up_read(&uts_sem); up_read(&uts_sem);
break; break;
/* executable */ /* executable, could be changed by prctl PR_SET_NAME etc */
case 'e': case 'e':
err = cn_esc_printf(cn, "%s", current->comm); err = cn_esc_printf(cn, "%s", current->comm);
break; break;
/* file name of executable */
case 'f':
err = cn_print_exe_file(cn, true);
break;
case 'E': case 'E':
err = cn_print_exe_file(cn); err = cn_print_exe_file(cn, false);
break; break;
/* core limit size */ /* core limit size */
case 'c': case 'c':
......
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