Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package chrony for openSUSE:Factory checked 
in at 2021-12-24 20:23:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chrony (Old)
 and      /work/SRC/openSUSE:Factory/.chrony.new.2520 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chrony"

Fri Dec 24 20:23:04 2021 rev:34 rq:942274 version:4.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/chrony/chrony.changes    2021-10-19 
23:03:31.233264590 +0200
+++ /work/SRC/openSUSE:Factory/.chrony.new.2520/chrony.changes  2021-12-24 
20:23:26.186027477 +0100
@@ -1,0 +2,43 @@
+Thu Dec 16 16:47:08 UTC 2021 - Reinhard Max <m...@suse.com>
+
+- Update to 4.2
+  * Add support for NTPv4 extension field improving synchronisation
+    stability and resolution of root delay and dispersion
+    (experimental)
+  * Add support for NTP over PTP (experimental)
+  * Add support for AES-CMAC and hash functions in GnuTLS
+  * Improve server interleaved mode to be more reliable and support
+    multiple clients behind NAT
+  * Update seccomp filter
+  * Fix RTC support with 64-bit time_t on 32-bit Linux
+  * Fix seccomp filter to work correctly with bind*device directives
+- Obsoleted patches:
+  * chrony-refid-internal-md5.patch
+  * harden_chrony-wait.service.patch
+  * harden_chronyd.service.patch
+- Update clknetsim to snapshot 470b5e9.
+
+-------------------------------------------------------------------
+Tue Dec  7 10:08:53 UTC 2021 - Reinhard Max <m...@suse.com>
+
+- Add chrony-htonl.patch to work around undocumented behaviour of
+  htonl() in older glibc versions (SLE-12) on 64 bit big endian
+  architectures (s390x).
+
+-------------------------------------------------------------------
+Fri Nov 19 16:39:44 UTC 2021 - Reinhard Max <m...@suse.com>
+
+- SLE bugs that have been fixed in openSUSE up to this point
+  without explicit references: bsc#1183783, bsc#1184400,
+  bsc#1171806, bsc#1161119, bsc#1159840.
+- Obsoleted SLE patches:
+  * chrony-fix-open.patch
+  * chrony-gettimeofday.patch
+  * chrony-ntp-era-split.patch
+  * chrony-pidfile.patch
+  * chrony-select-timeout.patch
+  * chrony-urandom.patch
+  * chrony.sysconfig
+  * clknetsim-glibc-2.31.patch
+
+-------------------------------------------------------------------

Old:
----
  chrony-4.1.tar.gz
  chrony-4.1.tar.gz.sig
  chrony-refid-internal-md5.patch
  clknetsim-f89702d.tar.gz
  harden_chrony-wait.service.patch
  harden_chronyd.service.patch

New:
----
  chrony-4.2.tar.gz
  chrony-4.2.tar.gz.sig
  chrony-htonl.patch
  clknetsim-470b5e9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ chrony.spec ++++++
--- /var/tmp/diff_new_pack.924T1f/_old  2021-12-24 20:23:27.226028022 +0100
+++ /var/tmp/diff_new_pack.924T1f/_new  2021-12-24 20:23:27.230028024 +0100
@@ -30,14 +30,14 @@
 %bcond_without testsuite
 
 %define _systemdutildir %(pkg-config --variable systemdutildir systemd)
-%global clknetsim_ver f89702d
+%global clknetsim_ver 470b5e9
 #Compat macro for new _fillupdir macro introduced in Nov 2017
 %if ! %{defined _fillupdir}
   %define _fillupdir %{_localstatedir}/adm/fillup-templates
 %endif
 %define chrony_helper %{_libexecdir}/chrony/helper
 Name:           chrony
-Version:        4.1
+Version:        4.2
 Release:        0
 Summary:        System Clock Synchronization Client and Server
 License:        GPL-2.0-only
@@ -64,9 +64,7 @@
 Patch1:         chrony-service-helper.patch
 Patch2:         chrony-logrotate.patch
 Patch3:         chrony-service-ordering.patch
-Patch4:         chrony-refid-internal-md5.patch
-Patch5:         harden_chrony-wait.service.patch
-Patch6:         harden_chronyd.service.patch
+Patch7:         chrony-htonl.patch
 BuildRequires:  NetworkManager-devel
 BuildRequires:  bison
 BuildRequires:  findutils
@@ -132,7 +130,7 @@
 Conflicts:      %name-pool
 Requires:       %name = %version
 BuildArch:      noarch
-RemovePathPostfixes: .suse
+Removepathpostfixes:.suse
 
 %description pool-suse
 This package configures chrony to use the SUSE NTP server pool by
@@ -147,7 +145,7 @@
 Requires:       %name = %version
 BuildArch:      noarch
 Supplements:    (chrony and branding-openSUSE)
-RemovePathPostfixes: .opensuse
+Removepathpostfixes:.opensuse
 
 %description pool-openSUSE
 This package configures chrony to use the openSUSE NTP server pool by
@@ -161,7 +159,7 @@
 Requires:       %name = %version
 BuildArch:      noarch
 Supplements:    (chrony and branding-SLE)
-RemovePathPostfixes: .empty
+Removepathpostfixes:.empty
 
 %description pool-empty
 This package provides an empty /etc/chrony.d/pool.conf file for
@@ -173,12 +171,10 @@
 %prep
 %setup -q -a 10
 %patch0 -p1
-%patch1 -p1
+%patch1
 %patch2 -p1
 %patch3
-%patch4
-%patch5 -p1
-%patch6
+%patch7
 
 # Remove pool statements from the default /etc/chrony.conf. They will
 # be provided by branding packages in /etc/chrony.d/pool.conf .

++++++ chrony-4.1.tar.gz -> chrony-4.2.tar.gz ++++++
++++ 9250 lines of diff (skipped)

++++++ chrony-htonl.patch ++++++
--- test/unit/util.c.orig
+++ test/unit/util.c
@@ -533,7 +533,7 @@ test_unit(void)
 #else
   TEST_CHECK(tspec.tv_sec_high == htonl(TV_NOHIGHSEC));
 #endif
-  TEST_CHECK(tspec.tv_sec_low == htonl(ts.tv_sec));
+  TEST_CHECK(tspec.tv_sec_low == htonl((uint32_t) ts.tv_sec));
   TEST_CHECK(tspec.tv_nsec == htonl(ts.tv_nsec));
   UTI_TimespecNetworkToHost(&tspec, &ts2);
   TEST_CHECK(!UTI_CompareTimespecs(&ts, &ts2));

++++++ chrony-service-helper.patch ++++++
--- /var/tmp/diff_new_pack.924T1f/_old  2021-12-24 20:23:27.450028140 +0100
+++ /var/tmp/diff_new_pack.924T1f/_new  2021-12-24 20:23:27.450028140 +0100
@@ -1,13 +1,11 @@
-diff -burNE chrony-3.5_orig/examples/chronyd.service 
chrony-3.5/examples/chronyd.service
---- chrony-3.5_orig/examples/chronyd.service   2019-10-19 10:20:18.421076350 
+0200
-+++ chrony-3.5/examples/chronyd.service        2019-10-19 10:23:20.521233091 
+0200
-@@ -10,6 +10,7 @@
+--- examples/chronyd.service.orig
++++ examples/chronyd.service
+@@ -10,6 +10,7 @@ Type=forking
  PIDFile=/run/chrony/chronyd.pid
  EnvironmentFile=-/etc/sysconfig/chronyd
  ExecStart=/usr/sbin/chronyd $OPTIONS
 +ExecStartPost=@CHRONY_HELPER@ update-daemon
- PrivateTmp=yes
- ProtectHome=yes
- ProtectSystem=full
-
+ 
+ CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE
+ CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_KILL CAP_LEASE 
CAP_LINUX_IMMUTABLE
 


++++++ clknetsim-f89702d.tar.gz -> clknetsim-470b5e9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/client.c 
new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/client.c
--- old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/client.c     
2021-04-21 09:49:16.000000000 +0200
+++ new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/client.c     
2021-11-25 15:33:02.000000000 +0100
@@ -16,9 +16,18 @@
  */
 
 #define _GNU_SOURCE
+
+/* avoid redirection in glibc headers */
+#define adjtimex adjtimex_off
+#include <sys/timex.h>
+#undef adjtimex
+
+#define fopen fopen_off
+#include <stdio.h>
+#undef fopen
+
 #include <sys/utsname.h>
 #include <sys/time.h>
-#include <sys/timex.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
@@ -29,7 +38,6 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <time.h>
-#include <stdio.h>
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <sys/un.h>
@@ -72,10 +80,10 @@
 #define LINK_SPEED 100000
 
 #define REFCLK_FD 1000
-#define REFCLK_ID ((~(clockid_t)REFCLK_FD << 3) | 3)
+#define REFCLK_ID ((clockid_t)(((unsigned int)~REFCLK_FD << 3) | 3))
 #define REFCLK_PHC_INDEX 0
 #define SYSCLK_FD 1001
-#define SYSCLK_CLOCKID ((~(clockid_t)SYSCLK_FD << 3) | 3)
+#define SYSCLK_CLOCKID ((clockid_t)(((unsigned int)~SYSCLK_FD << 3) | 3))
 #define SYSCLK_PHC_INDEX 1
 #define PPS_FD 1002
 #define URANDOM_FD 1010
@@ -90,12 +98,23 @@
 
 #define URANDOM_FILE (void *)0xD1230123
 
+#if !defined(__GLIBC_PREREQ) || __GLIBC_PREREQ(2, 33)
+#define HAVE_STAT
+#endif
+
 static FILE *(*_fopen)(const char *path, const char *mode);
 static FILE *(*_fdopen)(int fd, const char *mode);
 static size_t (*_fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
 static int (*_fileno)(FILE *stream);
 static int (*_fclose)(FILE *fp);
 static int (*_fcntl)(int fd, int cmd, ...);
+#ifdef HAVE_STAT
+static int (*_fstat)(int fd, struct stat *statbuf);
+static int (*_stat)(const char *pathname, struct stat *statbuf);
+#else
+static int (*_fxstat)(int ver, int fd, struct stat *statbuf);
+static int (*_xstat)(int ver, const char *pathname, struct stat *statbuf);
+#endif
 static int (*_open)(const char *pathname, int flags, ...);
 static ssize_t (*_read)(int fd, void *buf, size_t count);
 static int (*_close)(int fd);
@@ -118,7 +137,7 @@
 static int timestamping = 1;
 
 enum {
-       IFACE_NONE = 0,
+       IFACE_UNIX,
        IFACE_LO,
        IFACE_ALL,
        IFACE_ETH0,
@@ -134,6 +153,7 @@
 
 struct socket {
        int used;
+       int domain;
        int type;
        int port;
        int iface;
@@ -150,6 +170,7 @@
 
 static struct socket sockets[MAX_SOCKETS];
 static int subnets;
+static int unix_subnet = -1;
 
 static double real_time = 0.0;
 static double monotonic_time = 0.0;
@@ -211,6 +232,13 @@
        _fileno = (int (*)(FILE *stream))dlsym(RTLD_NEXT, "fileno");
        _fclose = (int (*)(FILE *fp))dlsym(RTLD_NEXT, "fclose");
        _fcntl = (int (*)(int fd, int cmd, ...))dlsym(RTLD_NEXT, "fcntl");
+#ifdef HAVE_STAT
+       _fstat = (int (*)(int fd, struct stat *statbuf))dlsym(RTLD_NEXT, 
"fstat");
+       _stat = (int (*)(const char *pathname, struct stat 
*statbuf))dlsym(RTLD_NEXT, "stat");
+#else
+       _fxstat = (int (*)(int ver, int fd, struct stat 
*statbuf))dlsym(RTLD_NEXT, "__fxstat");
+       _xstat = (int (*)(int ver, const char *pathname, struct stat 
*statbuf))dlsym(RTLD_NEXT, "__xstat");
+#endif
        _open = (int (*)(const char *pathname, int flags, ...))dlsym(RTLD_NEXT, 
"open");
        _read = (ssize_t (*)(int fd, void *buf, size_t count))dlsym(RTLD_NEXT, 
"read");
        _close = (int (*)(int fd))dlsym(RTLD_NEXT, "close");
@@ -264,7 +292,8 @@
                        ;
                fclose(f);
 
-               if (strncmp(command, "valgrind", 8) == 0) {
+               if (strncmp(command, "valgrind", 8) == 0 ||
+                   strncmp(command, "strace", 6) == 0) {
                        /* don't connect to the server */
                        initialized = 1;
                        return;
@@ -273,7 +302,8 @@
 
        if (fuzz_init()) {
                node = 0;
-               subnets = 1;
+               subnets = 2;
+               unix_subnet = 1;
                initialized = 1;
                return;
        }
@@ -285,6 +315,10 @@
        }
        node = atoi(env) - 1;
 
+       env = getenv("CLKNETSIM_UNIX_SUBNET");
+       if (env)
+               unix_subnet = atoi(env) - 1;
+
        env = getenv("CLKNETSIM_SOCKET");
        if (env)
                snprintf(s.sun_path, sizeof (s.sun_path), "%s", env);
@@ -456,11 +490,13 @@
        switch (sockets[socket].iface) {
                case IFACE_LO:
                        return 0;
-               case IFACE_NONE:
+               case IFACE_UNIX:
+                       return subnet == unix_subnet;
                case IFACE_ALL:
-                       return 1;
+                       return subnet != unix_subnet;
                default:
-                       return sockets[socket].iface - IFACE_ETH0 == subnet;
+                       return sockets[socket].iface - IFACE_ETH0 == subnet &&
+                               subnet != unix_subnet;
        }
 }
 
@@ -560,6 +596,7 @@
 static void send_msg_to_peer(int s, int type) {
        struct Request_send req;
 
+       assert(sockets[s].domain == AF_INET);
        assert(sockets[s].type == SOCK_STREAM);
 
        if (sockets[s].remote_node == -1)
@@ -684,7 +721,7 @@
        time_to_timeval(time, tv);
        tv->tv_sec += system_time_offset;
 
-       /* chrony clock precision routine hack */
+       /* old chrony clock precision routine hack */
        if (precision_hack)
                tv->tv_usec += random() % 2;
 
@@ -724,10 +761,10 @@
        time += 0.5e-9;
        time_to_timespec(time, tp);
        
-       if (which_clock == CLOCK_REALTIME || which_clock == REFCLK_ID)
+       if (which_clock != CLOCK_MONOTONIC && which_clock != 
CLOCK_MONOTONIC_COARSE)
                tp->tv_sec += system_time_offset;
 
-       /* ntpd clock precision routine hack */
+       /* chrony and ntpd clock precision routine hack */
        if (precision_hack) {
                static int x = 0;
                tp->tv_nsec += x++ * 101;
@@ -1220,6 +1257,8 @@
        else if (!strcmp(pathname, "/dev/urandom"))
                return URANDOM_FD;
 
+       init_symbols();
+
        if (mode_arg)
                r = _open(pathname, flags, mode);
        else
@@ -1273,7 +1312,8 @@
 int socket(int domain, int type, int protocol) {
        int s;
 
-       if (domain != AF_INET || (type != SOCK_DGRAM && type != SOCK_STREAM)) {
+       if ((domain != AF_INET && (domain != AF_UNIX || unix_subnet < 0)) ||
+           (type != SOCK_DGRAM && type != SOCK_STREAM)) {
                errno = EINVAL;
                return -1;
        }
@@ -1287,8 +1327,10 @@
 
        memset(sockets + s, 0, sizeof (struct socket));
        sockets[s].used = 1;
+       sockets[s].domain = domain;
        sockets[s].type = type;
        sockets[s].port = BASE_SOCKET_DEFAULT_PORT + s;
+       sockets[s].iface = domain == AF_UNIX ? IFACE_UNIX : IFACE_ALL;
        sockets[s].remote_node = -1;
 
        return get_socket_fd(s);
@@ -1297,7 +1339,7 @@
 int listen(int sockfd, int backlog) {
        int s = get_socket_from_fd(sockfd);
 
-       if (s < 0 || sockets[s].type != SOCK_STREAM) {
+       if (s < 0 || sockets[s].domain != AF_INET || sockets[s].type != 
SOCK_STREAM) {
                errno = EINVAL;
                return -1;
        }
@@ -1312,7 +1354,7 @@
        struct sockaddr_in *in;
        struct Reply_recv rep;
 
-       if (s < 0 || sockets[s].type != SOCK_STREAM) {
+       if (s < 0 || sockets[s].domain != AF_INET || sockets[s].type != 
SOCK_STREAM) {
                errno = EINVAL;
                return -1;
        }
@@ -1351,6 +1393,7 @@
                return -1;
        }
 
+       assert(sockets[s].domain == AF_INET);
        assert(sockets[s].type == SOCK_STREAM);
 
        if (sockets[s].connected) {
@@ -1364,23 +1407,42 @@
 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
        /* ntpd uses connect() and getsockname() to find the interface
           which will be used to send packets to an address */
-       int s = get_socket_from_fd(sockfd), port;
+       int s = get_socket_from_fd(sockfd);
        unsigned int node, subnet;
-       uint32_t a;
+       struct sockaddr_in *sin;
+       struct sockaddr_un *sun;
 
-       if (s < 0 || addr->sa_family != AF_INET) {
+       if (s < 0) {
                errno = EINVAL;
                return -1;
        }
 
-       port = ntohs(((const struct sockaddr_in *)addr)->sin_port);
-       a = ntohl(((const struct sockaddr_in *)addr)->sin_addr.s_addr);
+       switch (addr->sa_family) {
+               case AF_INET:
+                       sin = (struct sockaddr_in *)addr;
+                       assert(addrlen >= sizeof (*sin));
+                       get_target(s, ntohl(sin->sin_addr.s_addr), &subnet, 
&node);
 
-       get_target(s, a, &subnet, &node);
-
-       sockets[s].iface = IFACE_ETH0 + subnet;
-       sockets[s].remote_node = node;
-       sockets[s].remote_port = port;
+                       sockets[s].iface = IFACE_ETH0 + subnet;
+                       sockets[s].remote_node = node;
+                       sockets[s].remote_port = ntohs(sin->sin_port);
+                       break;
+               case AF_UNIX:
+                       sun = (struct sockaddr_un *)addr;
+                       assert(addrlen >= sizeof (*sun));
+
+                       assert(sockets[s].iface == IFACE_UNIX);
+                       if (sscanf(sun->sun_path, "/clknetsim/unix/%d:%d",
+                                  &sockets[s].remote_node, 
&sockets[s].remote_port) != 2) {
+                               errno = EINVAL;
+                               return -1;
+                       }
+                       sockets[s].remote_node--;
+                       break;
+               default:
+                       errno = EINVAL;
+                       return -1;
+       }
 
        if (sockets[s].type == SOCK_STREAM)
                send_msg_to_peer(s, MSG_TYPE_TCP_CONNECT);
@@ -1390,33 +1452,54 @@
 
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
        int s = get_socket_from_fd(sockfd), port;
+       struct sockaddr_in *sin;
+       struct sockaddr_un *sun;
        uint32_t a;
+       static int unix_sockets = 0;
 
-       if (s < 0 || addr->sa_family != AF_INET) {
+       if (s < 0) {
                errno = EINVAL;
                return -1;
        }
 
-       port = ntohs(((struct sockaddr_in *)addr)->sin_port);
-       a = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr);
-
-       if (port)
-               sockets[s].port = port;
+       switch (addr->sa_family) {
+               case AF_INET:
+                       assert(addrlen >= sizeof (*sin));
+                       sin = (struct sockaddr_in *)addr;
+
+                       port = ntohs(sin->sin_port);
+                       if (port)
+                               sockets[s].port = port;
+
+                       a = ntohl(sin->sin_addr.s_addr);
+
+                       if (a == INADDR_ANY) {
+                               sockets[s].iface = IFACE_ALL;
+                       } else if (a == INADDR_LOOPBACK) {
+                               sockets[s].iface = IFACE_LO;
+                       } else {
+                               int subnet = SUBNET_FROM_ADDR(a);
+                               assert(subnet >= 0 && subnet < subnets);
+                               if (a == NODE_ADDR(subnet, node)) {
+                                       sockets[s].iface = IFACE_ETH0 + subnet;
+                               } else if (a == BROADCAST_ADDR(subnet)) {
+                                       sockets[s].iface = IFACE_ETH0 + subnet;
+                                       sockets[s].broadcast = 1;
+                               } else {
+                                       assert(0);
+                               }
+                       }
+                       break;
+               case AF_UNIX:
+                       assert(addrlen >= sizeof (*sun));
+                       sun = (struct sockaddr_un *)addr;
 
-       if (a == INADDR_ANY)
-               sockets[s].iface = IFACE_ALL;
-       else if (a == INADDR_LOOPBACK)
-               sockets[s].iface = IFACE_LO;
-       else {
-               int subnet = SUBNET_FROM_ADDR(a);
-               assert(subnet >= 0 && subnet < subnets);
-               if (a == NODE_ADDR(subnet, node))
-                       sockets[s].iface = IFACE_ETH0 + subnet;
-               else if (a == BROADCAST_ADDR(subnet)) {
-                       sockets[s].iface = IFACE_ETH0 + subnet;
-                       sockets[s].broadcast = 1;
-               } else
-                       assert(0);
+                       assert(sockets[s].iface == IFACE_UNIX);
+                       sockets[s].port = ++unix_sockets;
+                       break;
+               default:
+                       errno = EINVAL;
+                       return -1;
        }
 
        return 0;
@@ -1426,7 +1509,7 @@
        int s = get_socket_from_fd(sockfd);
        uint32_t a;
 
-       if (s < 0) {
+       if (s < 0 || sockets[s].domain != AF_INET) {
                errno = EINVAL;
                return -1;
        }
@@ -1439,10 +1522,11 @@
        in->sin_port = htons(sockets[s].port);
 
        switch (sockets[s].iface) {
-               case IFACE_NONE:
                case IFACE_ALL:
                        a = INADDR_ANY;
                        break;
+               case IFACE_UNIX:
+                       assert(0);
                case IFACE_LO:
                        a = INADDR_LOOPBACK;
                        break;
@@ -1461,7 +1545,7 @@
 int setsockopt(int sockfd, int level, int optname, const void *optval, 
socklen_t optlen) {
        int subnet, s = get_socket_from_fd(sockfd);
 
-       if (s < 0) {
+       if (s < 0 || sockets[s].domain != AF_INET) {
                errno = EINVAL;
                return -1;
        }
@@ -1495,7 +1579,7 @@
 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t 
*optlen) {
        int s = get_socket_from_fd(sockfd);
 
-       if (s < 0) {
+       if (s < 0 || sockets[s].domain != AF_INET) {
                errno = EINVAL;
                return -1;
        }
@@ -1530,26 +1614,73 @@
        return 0;
 }
 
+int fstat(int fd, struct stat *statbuf) {
+       if (fd == URANDOM_FD)
+               return stat("/dev/urandom", statbuf);
+
+#ifdef HAVE_STAT
+       assert(_fstat);
+       return _fstat(fd, statbuf);
+#else
+       assert(_fxstat);
+       return _fxstat(_STAT_VER, fd, statbuf);
+#endif
+}
+
+int __fxstat(int ver, int fd, struct stat *stat_buf) {
+       return fstat(fd, stat_buf);
+}
+
+int stat(const char *pathname, struct stat *statbuf) {
+       if (strcmp(pathname, "/clknetsim") == 0 ||
+           strcmp(pathname, "/clknetsim/unix") == 0) {
+               memset(statbuf, 0, sizeof (*statbuf));
+               statbuf->st_mode = S_IFDIR | 0750;
+               return 0;
+       }
+
+#ifdef HAVE_STAT
+       assert(_stat);
+       return _stat(pathname, statbuf);
+#else
+       assert(_xstat);
+       return _xstat(_STAT_VER, pathname, statbuf);
+#endif
+}
+
+int __xstat(int ver, const char *pathname, struct stat *statbuf) {
+       return stat(pathname, statbuf);
+}
+
+int chmod(const char *pathname, mode_t mode) {
+       return 0;
+}
+
 int ioctl(int fd, unsigned long request, ...) {
+       int i, j, n, subnet, ret = 0, s = get_socket_from_fd(fd);
        va_list ap;
        struct ifconf *conf;
        struct ifreq *req;
-       int i, subnet, ret = 0, s = get_socket_from_fd(fd);
 
        va_start(ap, request);
 
        if (request == SIOCGIFCONF) {
                conf = va_arg(ap, struct ifconf *);
-               assert(conf->ifc_len >= sizeof (struct ifreq) * (1 + subnets));
-               conf->ifc_len = sizeof (struct ifreq) * (1 + subnets);
+               n = 1 + subnets - (unix_subnet >= 0 ? 1 : 0);
+               assert(conf->ifc_len >= sizeof (struct ifreq) * n);
+               conf->ifc_len = sizeof (struct ifreq) * n;
                sprintf(conf->ifc_req[0].ifr_name, "lo");
                ((struct 
sockaddr_in*)&conf->ifc_req[0].ifr_addr)->sin_addr.s_addr = 
htonl(INADDR_LOOPBACK);
                conf->ifc_req[0].ifr_addr.sa_family = AF_INET;
 
-               for (i = 0; i < subnets; i++) {
-                       sprintf(conf->ifc_req[i + 1].ifr_name, "eth%d", i);
-                       ((struct sockaddr_in*)&conf->ifc_req[i + 
1].ifr_addr)->sin_addr.s_addr = htonl(NODE_ADDR(i, node));
-                       conf->ifc_req[i + 1].ifr_addr.sa_family = AF_INET;
+               for (i = 0, j = 1; i < subnets && j < n; i++) {
+                       if (i == unix_subnet)
+                               continue;
+                       sprintf(conf->ifc_req[j].ifr_name, "eth%d", i);
+                       ((struct sockaddr_in 
*)&conf->ifc_req[j].ifr_addr)->sin_addr.s_addr =
+                               htonl(NODE_ADDR(i, node));
+                       conf->ifc_req[j].ifr_addr.sa_family = AF_INET;
+                       j++;
                }
        } else if (request == SIOCGIFINDEX) {
                req = va_arg(ap, struct ifreq *);
@@ -1716,9 +1847,9 @@
        struct iface {
                struct ifaddrs ifaddrs;
                struct sockaddr_in addr, netmask, broadaddr;
-               char name[11];
+               char name[16];
        } *ifaces;
-       int i;
+       int i, j;
        
        ifaces = malloc(sizeof (struct iface) * (1 + subnets));
 
@@ -1734,22 +1865,25 @@
        ifaces[0].netmask.sin_addr.s_addr = htonl(0xff000000);
        ifaces[0].broadaddr.sin_addr.s_addr = 0;
 
-       for (i = 0; i < subnets; i++) {
-               ifaces[i + 1].ifaddrs = (struct ifaddrs){
-                       .ifa_next = &ifaces[i + 2].ifaddrs,
+       for (i = 0, j = 1; i < subnets && j < 1 + subnets; i++) {
+               if (i == unix_subnet)
+                       continue;
+               ifaces[j].ifaddrs = (struct ifaddrs){
+                       .ifa_next = &ifaces[j + 1].ifaddrs,
                        .ifa_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING,
-                       .ifa_addr = (struct sockaddr *)&ifaces[i + 1].addr,
-                       .ifa_netmask = (struct sockaddr *)&ifaces[i + 
1].netmask,
-                       .ifa_broadaddr = (struct sockaddr *)&ifaces[i + 
1].broadaddr
+                       .ifa_addr = (struct sockaddr *)&ifaces[j].addr,
+                       .ifa_netmask = (struct sockaddr *)&ifaces[j].netmask,
+                       .ifa_broadaddr = (struct sockaddr *)&ifaces[j].broadaddr
                };
-               ifaces[i + 1].ifaddrs.ifa_name = ifaces[i + 1].name;
-               snprintf(ifaces[i + 1].name, sizeof (ifaces[i + 1].name), 
"eth%d", i);
-               ifaces[i + 1].addr.sin_addr.s_addr = htonl(NODE_ADDR(i, node));
-               ifaces[i + 1].netmask.sin_addr.s_addr = htonl(NETMASK);
-               ifaces[i + 1].broadaddr.sin_addr.s_addr = 
htonl(BROADCAST_ADDR(i));
+               ifaces[j].ifaddrs.ifa_name = ifaces[j].name;
+               snprintf(ifaces[j].name, sizeof (ifaces[j].name), "eth%d", i);
+               ifaces[j].addr.sin_addr.s_addr = htonl(NODE_ADDR(i, node));
+               ifaces[j].netmask.sin_addr.s_addr = htonl(NETMASK);
+               ifaces[j].broadaddr.sin_addr.s_addr = htonl(BROADCAST_ADDR(i));
+               j++;
        }
 
-       ifaces[i].ifaddrs.ifa_next = NULL;
+       ifaces[j - 1].ifaddrs.ifa_next = NULL;
 
        for (i = 0; i < 1 + subnets; i++) {
                ifaces[i].addr.sin_family = AF_INET;
@@ -1767,7 +1901,8 @@
 
 ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags) {
        struct Request_send req;
-       struct sockaddr_in connected_sa, *sa;
+       struct sockaddr_in *sin;
+       struct sockaddr_un *sun;
        struct cmsghdr *cmsg;
        int i, s = get_socket_from_fd(sockfd), timestamping;
 
@@ -1782,15 +1917,33 @@
                        errno = EISCONN;
                        return -1;
                }
-               sa = &connected_sa;
-               sa->sin_family = AF_INET;
-               sa->sin_port = htons(sockets[s].remote_port);
-               sa->sin_addr.s_addr = htonl(NODE_ADDR(sockets[s].iface - 
IFACE_ETH0,
-                                       sockets[s].remote_node));
+               req.subnet = sockets[s].iface >= IFACE_ETH0 ? sockets[s].iface 
- IFACE_ETH0 : unix_subnet;
+               req.to = sockets[s].remote_node;
+               req.dst_port = sockets[s].remote_port;
        } else {
-               sa = msg->msg_name;
-               assert(sa && msg->msg_namelen >= sizeof (struct sockaddr_in));
-               assert(sa->sin_family == AF_INET);
+               switch (sockets[s].domain) {
+                       case AF_INET:
+                               sin = msg->msg_name;
+                               assert(sin && msg->msg_namelen >= sizeof 
(*sin));
+                               assert(sin->sin_family == AF_INET);
+                               get_target(s, ntohl(sin->sin_addr.s_addr), 
&req.subnet, &req.to);
+                               req.dst_port = ntohs(sin->sin_port);
+                               break;
+                       case AF_UNIX:
+                               sun = msg->msg_name;
+                               assert(sun && msg->msg_namelen >= sizeof 
(*sun));
+                               assert(sun->sun_family == AF_UNIX);
+                               req.subnet = unix_subnet;
+                               if (sscanf(sun->sun_path, 
"/clknetsim/unix/%u:%u",
+                                          &req.to, &req.dst_port) != 2) {
+                                       errno = EINVAL;
+                                       return -1;
+                               }
+                               req.to--;
+                               break;
+                       default:
+                               assert(0);
+               }
        }
 
        switch (sockets[s].type) {
@@ -1805,9 +1958,9 @@
                        assert(0);
        }
 
-       get_target(s, ntohl(sa->sin_addr.s_addr), &req.subnet, &req.to);
        req.src_port = sockets[s].port;
-       req.dst_port = ntohs(sa->sin_port);
+
+       assert(socket_in_subnet(s, req.subnet));
        assert(req.src_port && req.dst_port);
 
        for (req.len = 0, i = 0; i < msg->msg_iovlen; i++) {
@@ -1903,7 +2056,8 @@
 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags) {
        struct message *last_ts_msg = NULL;
        struct Reply_recv rep;
-       struct sockaddr_in *sa;
+       struct sockaddr_in *sin;
+       struct sockaddr_un *sun;
        struct cmsghdr *cmsg;
        int msglen, cmsglen, s = get_socket_from_fd(sockfd);
 
@@ -1993,13 +2147,25 @@
        assert(!sockets[s].remote_port || sockets[s].remote_port == 
rep.src_port);
 
        if (msg->msg_name) {
-               assert(msg->msg_namelen >= sizeof (struct sockaddr_in));
-
-               sa = msg->msg_name;
-               sa->sin_family = AF_INET;
-               sa->sin_port = htons(rep.src_port);
-               sa->sin_addr.s_addr = htonl(NODE_ADDR(rep.subnet, rep.from));
-               msg->msg_namelen = sizeof (struct sockaddr_in);
+               switch (sockets[s].domain) {
+                       case AF_INET:
+                               assert(msg->msg_namelen >= sizeof (*sin));
+                               sin = msg->msg_name;
+                               sin->sin_family = AF_INET;
+                               sin->sin_port = htons(rep.src_port);
+                               sin->sin_addr.s_addr = 
htonl(NODE_ADDR(rep.subnet, rep.from));
+                               msg->msg_namelen = sizeof (struct sockaddr_in);
+                               break;
+                       case AF_UNIX:
+                               assert(msg->msg_namelen >= sizeof (*sun));
+                               sun = msg->msg_name;
+                               sun->sun_family = AF_UNIX;
+                               snprintf(sun->sun_path, sizeof (sun->sun_path),
+                                        "/clknetsim/unix/%d:%d", rep.from + 1, 
rep.src_port);
+                               break;
+                       default:
+                               assert(0);
+               }
        }
 
        assert(msg->msg_iovlen == 1);
@@ -2119,7 +2285,10 @@
 }
 
 ssize_t recv(int sockfd, void *buf, size_t len, int flags) {
-       struct sockaddr_in sa;
+       union {
+               struct sockaddr_in sin;
+               struct sockaddr_un sun;
+       } sa;
        socklen_t addrlen = sizeof (sa);
 
        return recvfrom(sockfd, buf, len, flags, (struct sockaddr *)&sa, 
&addrlen);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/client_fuzz.c 
new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/client_fuzz.c
--- old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/client_fuzz.c        
2021-04-21 09:49:16.000000000 +0200
+++ new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/client_fuzz.c        
2021-11-25 15:33:02.000000000 +0100
@@ -37,6 +37,7 @@
 static int fuzz_msg_type;
 static int fuzz_ports[MAX_FUZZ_PORTS];
 static int fuzz_port_index, fuzz_ports_n;
+static int fuzz_subnet;
 static int fuzz_timeout;
 static double fuzz_start;
 
@@ -82,6 +83,9 @@
        }
        fuzz_port_index = 0;
 
+       env = getenv("CLKNETSIM_FUZZ_SUBNET");
+       fuzz_subnet = env ? atoi(env) - 1 : 0;
+
        env = getenv("CLKNETSIM_FUZZ_START");
        fuzz_start = env ? atof(env) : 0.1;
 
@@ -149,7 +153,7 @@
                *from = -1;
        }
 
-       *subnet = 0;
+       *subnet = fuzz_subnet;
        *src_port = fuzz_get_fuzz_port();
        *dst_port = last_tx_src_port ? last_tx_src_port : fuzz_get_fuzz_port();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/clknetsim.bash 
new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/clknetsim.bash
--- old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/clknetsim.bash       
2021-04-21 09:49:16.000000000 +0200
+++ new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/clknetsim.bash       
2021-11-25 15:33:02.000000000 +0100
@@ -38,6 +38,7 @@
                allow
                cmdallow
                bindcmdaddress 0.0.0.0
+               bindcmdaddress /clknetsim/unix/chronyd.sock
                $config
                EOF
            args=(-d -f $CLKNETSIM_TMPDIR/conf.$node $opts)
@@ -94,10 +95,11 @@
     esac
 
     if [[ $CLKNETSIM_CLIENT_WRAPPER == *valgrind* ]]; then
+           unset DEBUGINFOD_URLS
            wrapper_options="--log-file=$CLKNETSIM_TMPDIR/valgrind.$node"
     fi
 
-    LD_PRELOAD=$CLKNETSIM_PATH/clknetsim.so \
+    
LD_PRELOAD=${CLKNETSIM_PRELOAD:+$CLKNETSIM_PRELOAD:}$CLKNETSIM_PATH/clknetsim.so
 \
        CLKNETSIM_NODE=$node CLKNETSIM_SOCKET=$CLKNETSIM_TMPDIR/sock \
        $CLKNETSIM_CLIENT_WRAPPER $wrapper_options \
        $client$suffix "${args[@]}" &> $CLKNETSIM_TMPDIR/log.$node &
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/clock.cc 
new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/clock.cc
--- old/clknetsim-f89702d93d0cf668f70f0ce4bfdc3d732766aacf/clock.cc     
2021-04-21 09:49:16.000000000 +0200
+++ new/clknetsim-470b5e9d1b801fa21e24dbea89ff7eb1365431fc/clock.cc     
2021-11-25 15:33:02.000000000 +0100
@@ -403,5 +403,5 @@
        int i;
 
        for (i = 0; i < size; i++)
-               offsets[i] = offset_generator->generate(NULL);
+               offsets[i] = offset_generator ? 
offset_generator->generate(NULL) : 0.0;
 }

Reply via email to