Message ID | 20201102200053.1171894-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux: Allow adjtime with NULL argument [BZ #26833] | expand |
Hi Adhemerval, > 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. > --- > sysdeps/unix/sysv/linux/adjtime.c | 11 ++++++-- > time/Makefile | 3 +- > time/tst-adjtime.c | 46 > +++++++++++++++++++++++++++++++ 3 files changed, 56 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..0c39a98523 > --- /dev/null > +++ b/time/tst-adjtime.c > @@ -0,0 +1,46 @@ > +/* Test program for adjtime function. > + 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> > + > + > +/* This tests is a regression one that just check the non-privileged > + interface provided by adjtime. */ > + > +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. > */ > + 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> Big thanks for fixing it. Reviewed-by: Lukasz Majewski <lukma@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
LGTM. Checked on aarch64-linux-gnu and powerpc64-linux-gnu. On Mon, 2 Nov 2020 at 17:01, Adhemerval Zanella via Libc-alpha < libc-alpha@sourceware.org> wrote: > 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. > --- > sysdeps/unix/sysv/linux/adjtime.c | 11 ++++++-- > time/Makefile | 3 +- > time/tst-adjtime.c | 46 +++++++++++++++++++++++++++++++ > 3 files changed, 56 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..0c39a98523 > --- /dev/null > +++ b/time/tst-adjtime.c > @@ -0,0 +1,46 @@ > +/* Test program for adjtime function. > + 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> > + > + > +/* This tests is a regression one that just check the non-privileged > + interface provided by adjtime. */ > + > +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. */ > + 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> > -- > 2.25.1 > >
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..0c39a98523 --- /dev/null +++ b/time/tst-adjtime.c @@ -0,0 +1,46 @@ +/* Test program for adjtime function. + 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> + + +/* This tests is a regression one that just check the non-privileged + interface provided by adjtime. */ + +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. */ + 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>