[PATCH] busybox: use settimeofday() instead of syscall

Rosen Penev rosenp at gmail.com
Fri Aug 7 01:02:46 EDT 2020


On Thu, Aug 6, 2020 at 9:49 PM <mutsugi at allied-telesis.co.jp> wrote:
>
> From: Masafumi UTSUGI <mutsugi at allied-telesis.co.jp>
>
> SYS_settimeofday syscall is not time64 safe.
> Using settimeofday() instead of syscall() is recommended or
> some C libraries such as musl might cause compile error.
Eh no.

The reason for using the syscall is that musl ignores the tz
parameter. See:
https://github.com/openwrt/openwrt/commit/5a7c064bdbb71bfbcded073c7c0a8723be306009

A proper fix is here:
https://github.com/openwrt/openwrt/pull/3004/commits/bd6af541da7b27399143ce91081c44c3c9a155d9

I will resend once busybox 1.3.2 gets merged.
>
> Signed-off-by: Masafumi UTSUGI <mutsugi at allied-telesis.co.jp>
> ---
>  Makefile                      |  2 +-
>  patches/250-date-k-flag.patch | 26 +++++++++++---------------
>  2 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 01441d1..baf375e 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
>
>  PKG_NAME:=busybox
>  PKG_VERSION:=1.31.1
> -PKG_RELEASE:=1
> +PKG_RELEASE:=2
>  PKG_FLAGS:=essential
>
>  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
> diff --git a/patches/250-date-k-flag.patch b/patches/250-date-k-flag.patch
> index 5aadbb2..ef0545c 100644
> --- a/patches/250-date-k-flag.patch
> +++ b/patches/250-date-k-flag.patch
> @@ -8,19 +8,15 @@
>   //usage:     "\n"
>   //usage:     "\nRecognized TIME formats:"
>   //usage:     "\n      hh:mm[:ss]"
> -@@ -139,9 +140,8 @@
> -
> - #include "libbb.h"
> - #include "common_bufsiz.h"
> --#if ENABLE_FEATURE_DATE_NANO
> --# include <sys/syscall.h>
> --#endif
> +@@ -142,6 +143,7 @@
> + #if ENABLE_FEATURE_DATE_NANO
> + # include <sys/syscall.h>
> + #endif
>  +#include <sys/time.h>
> -+#include <sys/syscall.h>
>
>   enum {
>         OPT_RFC2822   = (1 << 0), /* R */
> -@@ -149,8 +149,9 @@ enum {
> +@@ -149,8 +151,9 @@ enum {
>         OPT_UTC       = (1 << 2), /* u */
>         OPT_DATE      = (1 << 3), /* d */
>         OPT_REFERENCE = (1 << 4), /* r */
> @@ -32,7 +28,7 @@
>   };
>
>   #if ENABLE_LONG_OPTS
> -@@ -162,6 +163,7 @@ static const char date_longopts[] ALIGN1
> +@@ -162,6 +165,7 @@ static const char date_longopts[] ALIGN1 =
>         /*      "universal\0" No_argument       "u" */
>                 "date\0"      Required_argument "d"
>                 "reference\0" Required_argument "r"
> @@ -40,7 +36,7 @@
>                 ;
>   #endif
>
> -@@ -181,6 +183,8 @@ static void maybe_set_utc(int opt)
> +@@ -181,6 +185,8 @@ static void maybe_set_utc(int opt)
>   int date_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
>   int date_main(int argc UNUSED_PARAM, char **argv)
>   {
> @@ -49,7 +45,7 @@
>         struct timespec ts;
>         struct tm tm_time;
>         char buf_fmt_dt2str[64];
> -@@ -193,7 +197,7 @@ int date_main(int argc UNUSED_PARAM, cha
> +@@ -193,7 +199,7 @@ int date_main(int argc UNUSED_PARAM, char **argv)
>         char *isofmt_arg = NULL;
>
>         opt = getopt32long(argv, "^"
> @@ -58,7 +54,7 @@
>                         IF_FEATURE_DATE_ISOFMT("I::D:")
>                         "\0"
>                         "d--s:s--d"
> -@@ -256,6 +260,31 @@ int date_main(int argc UNUSED_PARAM, cha
> +@@ -256,6 +262,31 @@ int date_main(int argc UNUSED_PARAM, char **argv)
>         if (*argv)
>                 bb_show_usage();
>
> @@ -69,7 +65,7 @@
>  +
>  +              /* workaround warp_clock() on first invocation */
>  +              memset(&tz, 0, sizeof(tz));
> -+              syscall(SYS_settimeofday, NULL, &tz);
> ++              settimeofday(NULL, &tz);
>  +
>  +              memset(&tz, 0, sizeof(tz));
>  +#ifdef __USE_MISC
> @@ -78,7 +74,7 @@
>  +              tz.tz_minuteswest = -(tm_time.__tm_gmtoff / 60);
>  +#endif
>  +
> -+              if (syscall(SYS_settimeofday, NULL, &tz))
> ++              if (settimeofday(NULL, &tz))
>  +              {
>  +                      bb_perror_msg("can't set kernel time zone");
>  +                      return EXIT_FAILURE;
> --
> 2.7.4
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list