VFS: tweak coredump wrapper code
Change-Id: I6c1f50910d906b25f6df2b48f2cbfb899850924e
This commit is contained in:
parent
253dbfc285
commit
9f15e7b366
2 changed files with 25 additions and 12 deletions
|
@ -620,6 +620,14 @@ void service_pm_postponed(void)
|
||||||
term_signal = job_m_in.VFS_PM_TERM_SIG;
|
term_signal = job_m_in.VFS_PM_TERM_SIG;
|
||||||
core_path = (vir_bytes) job_m_in.VFS_PM_PATH;
|
core_path = (vir_bytes) job_m_in.VFS_PM_PATH;
|
||||||
|
|
||||||
|
/* A zero signal used to indicate that a coredump should be generated
|
||||||
|
* without terminating the target process, but this was broken in so
|
||||||
|
* many ways that we no longer support this. Userland should implement
|
||||||
|
* this functionality itself, for example through ptrace(2).
|
||||||
|
*/
|
||||||
|
if (term_signal == 0)
|
||||||
|
panic("no termination signal given for coredump!");
|
||||||
|
|
||||||
assert(proc_e == fp->fp_endpoint);
|
assert(proc_e == fp->fp_endpoint);
|
||||||
|
|
||||||
r = pm_dumpcore(term_signal, core_path);
|
r = pm_dumpcore(term_signal, core_path);
|
||||||
|
|
|
@ -879,36 +879,41 @@ int do_svrctl(void)
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
int pm_dumpcore(int csig, vir_bytes exe_name)
|
int pm_dumpcore(int csig, vir_bytes exe_name)
|
||||||
{
|
{
|
||||||
int r = OK, core_fd;
|
int r, core_fd;
|
||||||
struct filp *f;
|
struct filp *f;
|
||||||
char core_path[PATH_MAX];
|
char core_path[PATH_MAX];
|
||||||
char proc_name[PROC_NAME_LEN];
|
char proc_name[PROC_NAME_LEN];
|
||||||
|
|
||||||
/* if a process is blocked, fp->fp_fd holds the fd it's blocked on.
|
/* If a process is blocked, fp->fp_fd holds the fd it's blocked on. Free it
|
||||||
* free it up for use by common_open().
|
* up for use by common_open(). This step is the reason we cannot use this
|
||||||
|
* function to generate a core dump of a process while it is still running
|
||||||
|
* (i.e., without terminating it), as it changes the state of the process.
|
||||||
*/
|
*/
|
||||||
if (fp_is_blocked(fp))
|
if (fp_is_blocked(fp))
|
||||||
unpause();
|
unpause();
|
||||||
|
|
||||||
/* open core file */
|
/* open core file */
|
||||||
snprintf(core_path, PATH_MAX, "%s.%d", CORE_NAME, fp->fp_pid);
|
snprintf(core_path, PATH_MAX, "%s.%d", CORE_NAME, fp->fp_pid);
|
||||||
core_fd = common_open(core_path, O_WRONLY | O_CREAT | O_TRUNC, CORE_MODE);
|
r = core_fd = common_open(core_path, O_WRONLY | O_CREAT | O_TRUNC,
|
||||||
if (core_fd < 0) { r = core_fd; goto core_exit; }
|
CORE_MODE);
|
||||||
|
if (r < 0) goto core_exit;
|
||||||
|
|
||||||
/* get process' name */
|
/* get process name */
|
||||||
r = sys_datacopy_wrapper(PM_PROC_NR, exe_name, VFS_PROC_NR, (vir_bytes) proc_name,
|
r = sys_datacopy_wrapper(PM_PROC_NR, exe_name, VFS_PROC_NR,
|
||||||
PROC_NAME_LEN);
|
(vir_bytes) proc_name, PROC_NAME_LEN);
|
||||||
if (r != OK) goto core_exit;
|
if (r != OK) goto core_exit;
|
||||||
proc_name[PROC_NAME_LEN - 1] = '\0';
|
proc_name[PROC_NAME_LEN - 1] = '\0';
|
||||||
|
|
||||||
if ((f = get_filp(core_fd, VNODE_WRITE)) == NULL) { r=EBADF; goto core_exit; }
|
/* write the core dump */
|
||||||
|
f = get_filp(core_fd, VNODE_WRITE);
|
||||||
|
assert(f != NULL);
|
||||||
write_elf_core_file(f, csig, proc_name);
|
write_elf_core_file(f, csig, proc_name);
|
||||||
unlock_filp(f);
|
unlock_filp(f);
|
||||||
(void) close_fd(fp, core_fd); /* ignore failure, we're exiting anyway */
|
|
||||||
|
|
||||||
core_exit:
|
core_exit:
|
||||||
if(csig)
|
/* The core file descriptor will be closed as part of the process exit. */
|
||||||
free_proc(FP_EXITING);
|
free_proc(FP_EXITING);
|
||||||
|
|
||||||
return(r);
|
return(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue