HHello everyone,
My BSP still uses an older version of Linux and libc with a 32-bit time_t.
While migrating to ptxdist-2025.01.0, I encountered an unexpected crash in
the ntpd service. Specifically, when the BSP acts as an ntpd server, the
crash occurs on the client side.
After investigating the issue, I believe I have identified a bug. On my
system, time_t is effectively an int32_t. In the function that converts a
double to the NTP time format, I found the following code:
double d;
uint32_t intl;
intl = (uint32_t)(time_t)d;
Here, the integer part of d represents the number of seconds since
1900-01-01T00:00:00.0, which exceeds 31 bits.
Casting d to time_t in the server truncates the value to 0x7fffffff,
leading to a crash in the client.
The solution is to avoid the cast to time_t when sizeof(time_t) == 4.
I have attached a proposed patch for this issue. If someone with more
authority in the project could report this upstream, that would be
appreciated.
Best regards,
Ruggero
Some versions of Linux don't provide linux/blkzoned.h. In this case, attempting
to build blkzone produces an error. Suppress building of blkzone.
Index: util-linux-2.39.2/meson.build
===================================================================
--- util-linux-2.39.2.orig/meson.build
+++ util-linux-2.39.2/meson.build
@@ -1477,16 +1477,19 @@ exes += exe
manadocs += ['sys-utils/blkdiscard.8.adoc']
bashcompletions += ['blkdiscard']
-exe = executable(
- 'blkzone',
- blkzone_sources,
- include_directories : includes,
- link_with : [lib_common],
- install_dir : sbindir,
- install : true)
-exes += exe
-manadocs += ['sys-utils/blkzone.8.adoc']
-bashcompletions += ['blkzone']
+have = cc.has_header('linux/blkzoned.h')
+if have
+ exe = executable(
+ 'blkzone',
+ blkzone_sources,
+ include_directories : includes,
+ link_with : [lib_common],
+ install_dir : sbindir,
+ install : true)
+ exes += exe
+ manadocs += ['sys-utils/blkzone.8.adoc']
+ bashcompletions += ['blkzone']
+endif
exe = executable(
'blkpr',
Some versions of Linux don't provide linux/pr.h. In this case, attempting
to build blkpr produces an error. Suppress building of blkpr.
Index: util-linux-2.39.2/meson.build
===================================================================
--- util-linux-2.39.2.orig/meson.build
+++ util-linux-2.39.2/meson.build
@@ -1491,15 +1491,18 @@ if have
bashcompletions += ['blkzone']
endif
-exe = executable(
- 'blkpr',
- blkpr_sources,
- include_directories : includes,
- link_with : [lib_common],
- install_dir : sbindir,
- install : true)
-exes += exe
-manadocs += ['sys-utils/blkpr.8.adoc']
+have = cc.has_header('linux/pr.h')
+if have
+ exe = executable(
+ 'blkpr',
+ blkpr_sources,
+ include_directories : includes,
+ link_with : [lib_common],
+ install_dir : sbindir,
+ install : true)
+ exes += exe
+ manadocs += ['sys-utils/blkpr.8.adoc']
+endif
exe = executable(
'ldattach',
Some versions of Linux don't provide linux/kcmp.h. In this case, attempting
to build lsfd produces an error. Suppress building of lsfd.
Index: util-linux-2.39.2/meson.build
===================================================================
--- util-linux-2.39.2.orig/meson.build
+++ util-linux-2.39.2/meson.build
@@ -2595,17 +2595,20 @@ if not is_disabler(exe)
bashcompletions += ['lsblk']
endif
-exe = executable(
- 'lsfd',
- lsfd_sources,
- include_directories : includes,
- link_with : [lib_common,
- lib_smartcols],
- install_dir : usrbin_exec_dir,
- install : true)
-if not is_disabler(exe)
- exes += exe
- manadocs += ['misc-utils/lsfd.1.adoc']
+have = cc.has_header('linux/kcmp.h')
+if have
+ exe = executable(
+ 'lsfd',
+ lsfd_sources,
+ include_directories : includes,
+ link_with : [lib_common,
+ lib_smartcols],
+ install_dir : usrbin_exec_dir,
+ install : true)
+ if not is_disabler(exe)
+ exes += exe
+ manadocs += ['misc-utils/lsfd.1.adoc']
+ endif
endif
exe = executable(
Some old version of Linux don't provide the SIOCGSKNS ioctl in linux/sockios.h.
In this case, attempting to build test_mkfds produces an error. Suppress building
of test_mkfds.
Index: util-linux-2.39.2/meson.build
===================================================================
--- util-linux-2.39.2.orig/meson.build
+++ util-linux-2.39.2/meson.build
@@ -3288,11 +3288,14 @@ exe = executable(
exes += exe
if LINUX
- exe = executable(
- 'test_mkfds',
- 'tests/helpers/test_mkfds.c',
- include_directories : includes)
- exes += exe
+ have = cc.has_header_symbol('linux/sockios.h', 'SIOCGSKNS')
+ if have
+ exe = executable(
+ 'test_mkfds',
+ 'tests/helpers/test_mkfds.c',
+ include_directories : includes)
+ exes += exe
+ endif
endif
exe = executable(
--- /usr/local/lib/ptxdist-2023.11.0/rules/util-linux.make 2023-10-30 11:15:25.000000000 +0100
+++ util-linux.make 2024-01-07 18:24:56.336248170 +0100
@@ -127,7 +127,7 @@
-Dlibpcre2-posix=disabled \
-Dlibuser=disabled \
-Dlibutempter=disabled \
- -Dlibutil=disabled \
+ -Dlibutil=enabled \
-Dmagic=disabled \
-Dncurses=$(call ptx/endis, UTIL_LINUX_USES_NCURSES)d \
-Dncursesw=$(call ptx/endis, PTXCONF_UTIL_LINUX_USES_NCURSESW)d \
Index: busybox-1.37.0/networking/ntpd.c
===================================================================
--- busybox-1.37.0.orig/networking/ntpd.c
+++ busybox-1.37.0/networking/ntpd.c
@@ -583,8 +583,13 @@ d_to_lfp(l_fixedpt_t *lfp, double d)
{
uint32_t intl;
uint32_t frac;
- intl = (uint32_t)(time_t)d;
- frac = (uint32_t)((d - (time_t)d) * 0xffffffff);
+ if(sizeof(time_t) == 4){
+ intl = (uint32_t)d;
+ frac = (uint32_t)((d - intl) * 0xffffffff);
+ }else{
+ intl = (uint32_t)(time_t)d;
+ frac = (uint32_t)((d - (time_t)d) * 0xffffffff);
+ }
lfp->int_partl = htonl(intl);
lfp->fractionl = htonl(frac);
}