| From 07375fc6fd5912f34a36a097dc679f6e0af23f8a Mon Sep 17 00:00:00 2001 |
| From: Denys Vlasenko <vda.linux@googlemail.com> |
| Date: Thu, 24 Oct 2019 16:26:55 +0200 |
| Subject: [PATCH] Remove syscall wrappers around clock_gettime, closes 12091 |
| |
| 12091 "Direct use of __NR_clock_gettime is not time64-safe". |
| |
| function old new delta |
| runsv_main 1698 1712 +14 |
| startservice 378 383 +5 |
| get_mono 31 25 -6 |
| date_main 932 926 -6 |
| gettimeofday_ns 17 - -17 |
| ------------------------------------------------------------------------------ |
| (add/remove: 0/1 grow/shrink: 2/2 up/down: 19/-29) Total: -10 bytes |
| |
| Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| |
| (cherry picked from commit be5a505d771a77c640acc35ceaa470c80e62f954) |
| |
| Signed-off-by: Carlos Santos <unixmania@gmail.com> |
| --- |
| Makefile.flags | 6 ++++-- |
| coreutils/date.c | 16 +++------------- |
| libbb/time.c | 11 +---------- |
| runit/runsv.c | 11 +---------- |
| 4 files changed, 9 insertions(+), 35 deletions(-) |
| |
| diff --git a/Makefile.flags b/Makefile.flags |
| index 6f6142cc5..bea464753 100644 |
| --- a/Makefile.flags |
| +++ b/Makefile.flags |
| @@ -129,10 +129,12 @@ endif |
| # fall back to using a temp file: |
| CRYPT_AVAILABLE := $(shell echo 'int main(void){return 0;}' >crypttest.c; $(CC) $(CFLAGS) -lcrypt -o /dev/null crypttest.c >/dev/null 2>&1 && echo "y"; rm crypttest.c) |
| ifeq ($(CRYPT_AVAILABLE),y) |
| -LDLIBS += m crypt |
| +LDLIBS += m rt crypt |
| else |
| -LDLIBS += m |
| +LDLIBS += m rt |
| endif |
| +# libm may be needed for dc, awk, ntpd |
| +# librt may be needed for clock_gettime() |
| |
| # libpam may use libpthread, libdl and/or libaudit. |
| # On some platforms that requires an explicit -lpthread, -ldl, -laudit. |
| diff --git a/coreutils/date.c b/coreutils/date.c |
| index 1e0a675ca..e479c23a2 100644 |
| --- a/coreutils/date.c |
| +++ b/coreutils/date.c |
| @@ -33,10 +33,9 @@ |
| //config: Enable option (-I) to output an ISO-8601 compliant |
| //config: date/time string. |
| //config: |
| -//config:# defaults to "no": stat's nanosecond field is a bit non-portable |
| //config:config FEATURE_DATE_NANO |
| //config: bool "Support %[num]N nanosecond format specifier" |
| -//config: default n # syscall(__NR_clock_gettime) or syscall(__NR_clock_gettime64) |
| +//config: default n # stat's nanosecond field is a bit non-portable |
| //config: depends on DATE |
| //config: select PLATFORM_LINUX |
| //config: help |
| @@ -271,17 +270,8 @@ int date_main(int argc UNUSED_PARAM, char **argv) |
| */ |
| #endif |
| } else { |
| -#if ENABLE_FEATURE_DATE_NANO && defined(__NR_clock_gettime) |
| - /* libc has incredibly messy way of doing this, |
| - * typically requiring -lrt. We just skip all this mess */ |
| - syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts); |
| -#elif ENABLE_FEATURE_DATE_NANO && __TIMESIZE == 64 |
| - /* Let's only support the 64 suffix syscalls for 64-bit time_t. |
| - * This simplifies the code for us as we don't need to convert |
| - * between 64-bit and 32-bit. We also don't have a way to |
| - * report overflow errors here. |
| - */ |
| - syscall(__NR_clock_gettime64, CLOCK_REALTIME, &ts); |
| +#if ENABLE_FEATURE_DATE_NANO |
| + clock_gettime(CLOCK_REALTIME, &ts); |
| #else |
| time(&ts.tv_sec); |
| #endif |
| diff --git a/libbb/time.c b/libbb/time.c |
| index 821f9a24b..1077bfa4f 100644 |
| --- a/libbb/time.c |
| +++ b/libbb/time.c |
| @@ -253,18 +253,9 @@ char* FAST_FUNC strftime_YYYYMMDDHHMMSS(char *buf, unsigned len, time_t *tp) |
| #define CLOCK_MONOTONIC 1 |
| #endif |
| |
| -/* libc has incredibly messy way of doing this, |
| - * typically requiring -lrt. We just skip all this mess */ |
| static void get_mono(struct timespec *ts) |
| { |
| -#if defined(__NR_clock_gettime) |
| - if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, ts)) |
| -#elif __TIMESIZE == 64 |
| - if (syscall(__NR_clock_gettime64, CLOCK_MONOTONIC, ts)) |
| -#else |
| -# error "We currently don't support architectures without " \ |
| - "the __NR_clock_gettime syscall and 32-bit time_t" |
| -#endif |
| + if (clock_gettime(CLOCK_MONOTONIC, ts)) |
| bb_error_msg_and_die("clock_gettime(MONOTONIC) failed"); |
| } |
| unsigned long long FAST_FUNC monotonic_ns(void) |
| diff --git a/runit/runsv.c b/runit/runsv.c |
| index 737909b0e..36d85101e 100644 |
| --- a/runit/runsv.c |
| +++ b/runit/runsv.c |
| @@ -51,18 +51,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| #if ENABLE_MONOTONIC_SYSCALL |
| #include <sys/syscall.h> |
| |
| -/* libc has incredibly messy way of doing this, |
| - * typically requiring -lrt. We just skip all this mess */ |
| static void gettimeofday_ns(struct timespec *ts) |
| { |
| -#if defined(__NR_clock_gettime) |
| - syscall(__NR_clock_gettime, CLOCK_REALTIME, ts); |
| -#elif __TIMESIZE == 64 |
| - syscall(__NR_clock_gettime64, CLOCK_REALTIME, ts); |
| -#else |
| -# error "We currently don't support architectures without " \ |
| - "the __NR_clock_gettime syscall and 32-bit time_t" |
| -#endif |
| + clock_gettime(CLOCK_REALTIME, ts); |
| } |
| #else |
| static void gettimeofday_ns(struct timespec *ts) |
| -- |
| 2.18.2 |
| |