| From 75a193b7611bade31a150dfcc528b973e3d46231 Mon Sep 17 00:00:00 2001 |
| From: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
| Date: Mon, 2 Nov 2020 16:18:29 -0300 |
| Subject: [PATCH] linux: Allow adjtime with NULL argument [BZ #26833] |
| |
| The adjtime interface allows return the amount of time remaining |
| from any previous adjustment that has not yet been completed by |
| passing a NULL as first argument. This was introduced with y2038 |
| support 0308077e3a. |
| |
| Checked on i686-linux-gnu. |
| |
| Reviewed-by: Lukasz Majewski <lukma@denx.de> |
| Upstream-Status: Backport [https://sourceware.org/git/?p=glibc.git;a=commit;h=75a193b7611bade31a150dfcc528b973e3d46231] |
| Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com> |
| --- |
| sysdeps/unix/sysv/linux/adjtime.c | 11 +++++--- |
| time/Makefile | 3 ++- |
| time/tst-adjtime.c | 44 +++++++++++++++++++++++++++++++ |
| 3 files changed, 54 insertions(+), 4 deletions(-) |
| create mode 100644 time/tst-adjtime.c |
| |
| diff --git a/sysdeps/unix/sysv/linux/adjtime.c b/sysdeps/unix/sysv/linux/adjtime.c |
| index 3f9a4ea2eb..6d1d1b6af2 100644 |
| --- a/sysdeps/unix/sysv/linux/adjtime.c |
| +++ b/sysdeps/unix/sysv/linux/adjtime.c |
| @@ -68,11 +68,16 @@ libc_hidden_def (__adjtime64) |
| int |
| __adjtime (const struct timeval *itv, struct timeval *otv) |
| { |
| - struct __timeval64 itv64, otv64; |
| + struct __timeval64 itv64, *pitv64 = NULL; |
| + struct __timeval64 otv64; |
| int retval; |
| |
| - itv64 = valid_timeval_to_timeval64 (*itv); |
| - retval = __adjtime64 (&itv64, otv != NULL ? &otv64 : NULL); |
| + if (itv != NULL) |
| + { |
| + itv64 = valid_timeval_to_timeval64 (*itv); |
| + pitv64 = &itv64; |
| + } |
| + retval = __adjtime64 (pitv64, otv != NULL ? &otv64 : NULL); |
| if (otv != NULL) |
| *otv = valid_timeval64_to_timeval (otv64); |
| |
| diff --git a/time/Makefile b/time/Makefile |
| index 26aa835166..f27a75a115 100644 |
| --- a/time/Makefile |
| +++ b/time/Makefile |
| @@ -47,7 +47,8 @@ tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ |
| tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \ |
| tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \ |
| tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \ |
| - tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 |
| + tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \ |
| + tst-adjtime |
| |
| include ../Rules |
| |
| diff --git a/time/tst-adjtime.c b/time/tst-adjtime.c |
| new file mode 100644 |
| index 0000000000..ae2b37cdab |
| --- /dev/null |
| +++ b/time/tst-adjtime.c |
| @@ -0,0 +1,44 @@ |
| +/* Basic tests for adjtime. |
| + Copyright (C) 2020 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 <sys/time.h> |
| +#include <stdlib.h> |
| + |
| +#include <errno.h> |
| +#include <support/check.h> |
| + |
| + |
| +static int |
| +do_test (void) |
| +{ |
| + /* Check if the interface allows getting the amount of time remaining |
| + from any previous adjustment that has not yet been completed. This |
| + is a non-privileged function of adjtime. */ |
| + struct timeval tv; |
| + int r = adjtime (NULL, &tv); |
| + if (r == -1) |
| + { |
| + if (errno == ENOSYS) |
| + FAIL_UNSUPPORTED ("adjtime unsupported"); |
| + FAIL_EXIT1 ("adjtime (NULL, ...) failed: %m"); |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +#include <support/test-driver.c> |