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; }