From 19d91f6c2fcc4dea3b86e05721275cf0f8117e74 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Thu, 14 Jan 2010 16:40:45 -0800 Subject: PR11151: Recover stap_uprobes slots on process exit When a process exits, it won't necessarily bother to munmap all of its shared libraries. This patch makes sure that with uprobes in libraries, we still grab an exit notification and clear everything out. * runtime/uprobes-common.c (stap_uprobe_process_munmap): New. * tapsets.cxx (uprobe_derived_probe_group::emit_module_decls): Use above callback so that we can recover our resources on process exit. --- runtime/uprobes-common.c | 15 +++++++++++++++ runtime/uprobes-common.h | 1 + 2 files changed, 16 insertions(+) (limited to 'runtime') diff --git a/runtime/uprobes-common.c b/runtime/uprobes-common.c index b0273ba4..58e3a05f 100644 --- a/runtime/uprobes-common.c +++ b/runtime/uprobes-common.c @@ -286,4 +286,19 @@ static int stap_uprobe_munmap_found (struct stap_task_finder_target *tgt, struct return stap_uprobe_change_minus (tsk, addr, length, stf); } +/* The task_finder_callback we use for ET_DYN targets. + This just forces an unmap of everything as the process exits. + (PR11151) */ +static int stap_uprobe_process_munmap (struct stap_task_finder_target *tgt, struct task_struct *tsk, int register_p, int process_p) { + const struct stap_uprobe_tf *stf = container_of(tgt, struct stap_uprobe_tf, finder); + if (! process_p) return 0; /* ignore threads */ + #ifdef DEBUG_TASK_FINDER_VMA + _stp_dbug (__FUNCTION__,__LINE__, "%cproc pid %d stf %p %p path %s\n", register_p?'+':'-', tsk->tgid, tgt, stf, stf->pathname); + #endif + /* Covering 0->TASK_SIZE means "unmap everything" */ + if (!register_p) + return stap_uprobe_change_minus (tsk, 0, TASK_SIZE, stf); + return 0; +} + #endif /* _UPROBE_COMMON_C_ */ diff --git a/runtime/uprobes-common.h b/runtime/uprobes-common.h index 68741f4d..990b473a 100644 --- a/runtime/uprobes-common.h +++ b/runtime/uprobes-common.h @@ -33,5 +33,6 @@ struct stap_uprobe_spec { static int stap_uprobe_process_found (struct stap_task_finder_target *tgt, struct task_struct *tsk, int register_p, int process_p); static int stap_uprobe_mmap_found (struct stap_task_finder_target *tgt, struct task_struct *tsk, char *path, unsigned long addr, unsigned long length, unsigned long offset, unsigned long vm_flags); static int stap_uprobe_munmap_found (struct stap_task_finder_target *tgt, struct task_struct *tsk, unsigned long addr, unsigned long length); +static int stap_uprobe_process_munmap (struct stap_task_finder_target *tgt, struct task_struct *tsk, int register_p, int process_p); #endif /* _UPROBE_COMMON_H_ */ -- cgit From 80faaf7d57e005f4c2a6864525d2612621b2fbb7 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Fri, 15 Jan 2010 14:00:49 +0800 Subject: Improve stack printing format * runtime/stack.c (_stp_stack_print_tsk): Use _stp_symbol_print. --- runtime/stack.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'runtime') diff --git a/runtime/stack.c b/runtime/stack.c index 7dfeb76a..0e537a8e 100644 --- a/runtime/stack.c +++ b/runtime/stack.c @@ -212,7 +212,8 @@ void _stp_stack_print_tsk(struct task_struct *tsk, int verbose, int levels) for (i = 0; i < maxLevels; ++i) { if (backtrace[i] == 0 || backtrace[i] == ULONG_MAX) break; - _stp_printf("%lx ", backtrace[i]); + _stp_symbol_print(backtrace[i]); + _stp_print_char('\n'); } #endif } -- cgit From 4b9b5e8597daa65325756b18fcb87b71c60b26aa Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 15 Jan 2010 03:04:18 -0500 Subject: runtime: better staprun diagnostics for failed signature tests * modverify.c (verify_module): Print some messages for verbose > 1. --- runtime/staprun/modverify.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/staprun/modverify.c b/runtime/staprun/modverify.c index a17bb2ec..5d442393 100644 --- a/runtime/staprun/modverify.c +++ b/runtime/staprun/modverify.c @@ -272,12 +272,18 @@ int verify_module (const char *signatureName, const char* module_name, /* Verify the permissions of the certificate database and its files. */ if (! check_cert_db_permissions (dbdir)) - return MODULE_UNTRUSTED; + { + if (verbose>1) fprintf (stderr, "Certificate db %s permissions too loose\n", dbdir); + return MODULE_UNTRUSTED; + } /* Get the size of the signature file. */ prStatus = PR_GetFileInfo (signatureName, &info); if (prStatus != PR_SUCCESS || info.type != PR_FILE_FILE || info.size < 0) - return MODULE_UNTRUSTED; /* Not signed */ + { + if (verbose>1) fprintf (stderr, "Signature file %s not found\n", signatureName); + return MODULE_UNTRUSTED; /* Not signed */ + } /* Open the signature file. */ local_file_fd = PR_Open (signatureName, PR_RDONLY, 0); -- cgit