From a72bc5e6bf45cea7fbb349e53e05dc7a580be4de Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Sun, 19 Feb 2023 07:18:37 -0700 Subject: [PATCH] get_starttime: add support for GNU Hurd using the mach task_info call. This is currently Hurd-specific but could be made Mach-generic as long as the equivalent of pid2task() is available. --- .../regress/starttime/check_starttime.c | 2 +- plugins/sudoers/starttime.c | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/plugins/sudoers/regress/starttime/check_starttime.c b/plugins/sudoers/regress/starttime/check_starttime.c index b4095d9ba..c07396ef2 100644 --- a/plugins/sudoers/regress/starttime/check_starttime.c +++ b/plugins/sudoers/regress/starttime/check_starttime.c @@ -32,7 +32,7 @@ sudo_dso_public int main(int argc, char *argv[]); -#if defined(sudo_kinfo_proc) || defined(__linux__) || defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) || defined(HAVE_PSTAT_GETPROC) +#if defined(sudo_kinfo_proc) || defined(__linux__) || defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) || defined(HAVE_PSTAT_GETPROC) || defined(__gnu_hurd__) #ifdef __linux__ static int diff --git a/plugins/sudoers/starttime.c b/plugins/sudoers/starttime.c index 52ebac14b..44d153116 100644 --- a/plugins/sudoers/starttime.c +++ b/plugins/sudoers/starttime.c @@ -47,6 +47,12 @@ # include #endif +#if defined(__gnu_hurd__) +# include +# include +# include +#endif + #include #include #include @@ -298,6 +304,31 @@ get_starttime(pid_t pid, struct timespec *starttime) "unable to get start time for %d via pstat_getproc", (int)pid); debug_return_int(-1); } +#elif defined(__gnu_hurd__) +int +get_starttime(pid_t pid, struct timespec *starttime) +{ + mach_msg_type_number_t count; + struct task_basic_info info; + kern_return_t error; + task_t target; + debug_decl(get_starttime, SUDOERS_DEBUG_UTIL); + + target = pid2task(pid); + if (target != MACH_PORT_NULL) { + count = sizeof(info) / sizeof(integer_t); + error = task_info(target, TASK_BASIC_INFO, (task_info_t)&info, &count); + if (error == KERN_SUCCESS) { + starttime->tv_sec = info.creation_time.seconds; + starttime->tv_nsec = info.creation_time.microseconds * 1000; + debug_return_int(0); + } + } + + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO, + "unable to get start time for %d via task_info", (int)pid); + debug_return_int(-1); +} #else int get_starttime(pid_t pid, struct timespec *starttime)