diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -354,7 +354,11 @@ exec_args_get_begin_envv(args) - args->begin_argv); AUDIT_ARG_ENVV(exec_args_get_begin_envv(args), args->envc, args->endp - exec_args_get_begin_envv(args)); - +#ifdef KTRACE + if (KTRPOINT(td, KTR_EXECVE_ARGS)) { + ktrexecveargs(args); + } +#endif /* Must have at least one argument. */ if (args->argc == 0) { exec_free_args(args); diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -124,6 +124,7 @@ [KTR_FAULT] = sizeof(struct ktr_fault), [KTR_FAULTEND] = sizeof(struct ktr_faultend), [KTR_STRUCT_ARRAY] = sizeof(struct ktr_struct_array), + [KTR_EXECVE_ARGS] = 0, }; static STAILQ_HEAD(, ktr_request) ktr_free; @@ -559,6 +560,29 @@ ktr_submitrequest(curthread, req); } +void +ktrexecveargs(struct image_args *args) +{ + struct ktr_request *req; + int argc = exec_args_get_begin_envv(args) - args->begin_argv; + int envc = args->endp - exec_args_get_begin_envv(args); + char* buf = malloc(argc + envc + 2, M_KTRACE, M_WAITOK); + bcopy(args->begin_argv, buf, argc); + bcopy("\0", buf + argc, 1); + bcopy(exec_args_get_begin_envv(args), buf + argc + 1, envc); + bcopy("\0", buf + argc + 1 + envc, 1); + req = ktr_getrequest(KTR_EXECVE_ARGS); + if (req == NULL) { + if (buf != NULL) + free(buf, M_KTRACE); + return; + } + req->ktr_header.ktr_len = argc + envc + 2; + req->ktr_buffer = buf; + ktr_submitrequest(curthread, req); +} + + void ktrsysret(int code, int error, register_t retval) { diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -37,6 +37,10 @@ #include #include #include +#ifndef _KERNEL +#include +#endif +#include /* * operations to ktrace system call (KTROP(op)) @@ -263,6 +267,8 @@ */ }; +#define KTR_EXECVE_ARGS 16 + /* * KTR_DROP - If this bit is set in ktr_type, then at least one event * between the previous record and this record was dropped. @@ -295,6 +301,7 @@ #define KTRFAC_FAULT (1<ktr_type); type = unknown; @@ -1646,6 +1653,19 @@ printf("\"%.*s\"\n", len, cp); } +void +ktrexecveargs(char* args, int num) +{ + for (int i = 0; i < num; ++i) { + if (args[i] == '\0') { + printf(" "); + } else { + printf("%c", args[i]); + } + } + printf("\n"); +} + void hexdump(char *p, int len, int screenwidth) { diff --git a/usr.bin/ktrace/ktrace.h b/usr.bin/ktrace/ktrace.h --- a/usr.bin/ktrace/ktrace.h +++ b/usr.bin/ktrace/ktrace.h @@ -31,7 +31,8 @@ #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \ KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \ - KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_STRUCT_ARRAY) + KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_STRUCT_ARRAY | \ + KTRFAC_EXECVE_ARGS) #define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR)