We are trying to find a function that sets time directly through linux kernel without the need of using the user space. We found that there is a function restricted to super user on the file clock_settime.c:
* Copyright (C) 1991-2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <errno.h>
#include <time.h>
#include <hurd.h>
#include <hurd/port.h>
#include <shlib-compat.h>
/* Set the current time of day.
This call is restricted to the super-user. */
int
__clock_settime (clockid_t clock_id, const struct timespec *ts)
{
error_t err;
mach_port_t hostpriv;
time_value_t tv;
if (clock_id != CLOCK_REALTIME
|| ! valid_nanoseconds (ts->tv_nsec))
return __hurd_fail (EINVAL);
err = __get_privileged_ports (&hostpriv, NULL);
if (err)
return __hurd_fail (EPERM);
TIMESPEC_TO_TIME_VALUE (&tv, ts);
err = __host_set_time (hostpriv, tv);
__mach_port_deallocate (__mach_task_self (), hostpriv);
return __hurd_fail (err);
}
libc_hidden_def (__clock_settime)
versioned_symbol (libc, __clock_settime, clock_settime, GLIBC_2_17);
/* clock_settime moved to libc in version 2.17;
old binaries may expect the symbol version it had in librt. */
#if SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_17)
strong_alias (__clock_settime, __clock_settime_2);
compat_symbol (libc, __clock_settime_2, clock_settime, GLIBC_2_2);
#endif
We want to follow the function __host_set_time
declaration but there are no library references anywhere, we think that it may be the function that could help us solve our problem. Does someone know where it comes from and what it does?
Thanks in advance.
CodePudding user response:
You're looking at the wrong source tree. The code you quote is part of the GNU C Library, which is user space. Moreover, that code is only used on the Hurd operating system, not on Linux. This C library's implementation of clock_settime for Linux is in sysdeps/unix/sysv/linux/clock_settime.c
and you will see that this just invokes macros that expand to inline assembly for a system-call trap.
You should be searching the source code for the Linux kernel itself, not the C library. I put "clock_settime" into the search box on https://elixir.bootlin.com/ and, after a couple of jumps, found do_settimeofday64
which I believe is the API you are looking for. You might also want to consult the code for the actual system call entry points, which are in kernel/time/time.c
; these are wrappers that perform safe memory reads and security checks and then invoke do_settimeofday64.