From 98d78eeae58ffa095da926fa80fd89dd9ed56937 Mon Sep 17 00:00:00 2001 From: john crosbie Date: Tue, 21 Apr 2026 12:11:46 -0700 Subject: [PATCH] Fix 32-bit time_t compile errors in DLTv2 timestamp code On platforms where time_t is 32-bit (e.g. armv7/musl, glibc arm with default _FILE_OFFSET_BITS), several DLTv2 timestamp call sites trigger -Werror=shift-count-overflow, -Werror=sign-conversion, or -Werror=sign-compare, preventing compilation. Fixes: - ts.tv_sec >> 32 (9 sites in dlt-daemon.c, dlt_daemon_client.c, dlt_client.c, dlt_user.c, dlt_common.c): cast to uint64_t before shifting. On 32-bit time_t the shift is UB; on 64-bit it is a no-op. The top byte of the 40-bit seconds field is now correctly zero on 32-bit platforms instead of carrying a stray duplicate of the low byte (caused by ARM's 5-bit shift-count mask). - time_t tt = msg->storageheader->seconds (dlt_common.c:1084): explicit (time_t) cast to silence sign-conversion when time_t is signed 32-bit. - st.st_size > UINT_MAX (dlt_user.c:5620): cast st.st_size to uintmax_t for the comparison, avoiding the signed/unsigned mismatch between off_t and unsigned int. Signed-off-by: john crosbie --- src/daemon/dlt-daemon.c | 4 ++-- src/daemon/dlt_daemon_client.c | 4 ++-- src/lib/dlt_client.c | 4 ++-- src/lib/dlt_user.c | 6 +++--- src/shared/dlt_common.c | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index b3da31dd0..79605e5f9 100644 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -2715,7 +2715,7 @@ int dlt_daemon_log_internal(DltDaemon *daemon, DltDaemonLocal *daemon_local, #else struct timespec ts; if(clock_gettime(CLOCK_REALTIME, &ts) == 0) { - msg.headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg.headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg.headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg.headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg.headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); @@ -2724,7 +2724,7 @@ int dlt_daemon_log_internal(DltDaemon *daemon, DltDaemonLocal *daemon_local, msg.headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */ } }else if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - msg.headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg.headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg.headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg.headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg.headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); diff --git a/src/daemon/dlt_daemon_client.c b/src/daemon/dlt_daemon_client.c index 4d576f583..2c19c993b 100644 --- a/src/daemon/dlt_daemon_client.c +++ b/src/daemon/dlt_daemon_client.c @@ -876,7 +876,7 @@ int dlt_daemon_client_send_control_message_v2(int sock, #else struct timespec ts; if (clock_gettime(CLOCK_REALTIME, &ts) == 0) { - msg->headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg->headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg->headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg->headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg->headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); @@ -885,7 +885,7 @@ int dlt_daemon_client_send_control_message_v2(int sock, msg->headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */ } } else if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - msg->headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg->headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg->headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg->headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg->headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c index bd6ea67b0..982f0b54e 100644 --- a/src/lib/dlt_client.c +++ b/src/lib/dlt_client.c @@ -1030,7 +1030,7 @@ DltReturnValue dlt_client_send_ctrl_msg_v2(DltClient *client, char *apid, char * #else struct timespec ts; if(clock_gettime(CLOCK_REALTIME, &ts) == 0) { - msg.headerextrav2.seconds[0]=(ts.tv_sec >> 32) & 0xFF; + msg.headerextrav2.seconds[0]=((uint64_t)ts.tv_sec >> 32) & 0xFF; msg.headerextrav2.seconds[1]=(ts.tv_sec >> 24) & 0xFF; msg.headerextrav2.seconds[2]=(ts.tv_sec >> 16) & 0xFF; msg.headerextrav2.seconds[3]=(ts.tv_sec >> 8) & 0xFF; @@ -1039,7 +1039,7 @@ DltReturnValue dlt_client_send_ctrl_msg_v2(DltClient *client, char *apid, char * msg.headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */ } }else if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - msg.headerextrav2.seconds[0]=(ts.tv_sec >> 32) & 0xFF; + msg.headerextrav2.seconds[0]=((uint64_t)ts.tv_sec >> 32) & 0xFF; msg.headerextrav2.seconds[1]=(ts.tv_sec >> 24) & 0xFF; msg.headerextrav2.seconds[2]=(ts.tv_sec >> 16) & 0xFF; msg.headerextrav2.seconds[3]=(ts.tv_sec >> 8) & 0xFF; diff --git a/src/lib/dlt_user.c b/src/lib/dlt_user.c index 31e9d3d51..3b7ff394a 100644 --- a/src/lib/dlt_user.c +++ b/src/lib/dlt_user.c @@ -5465,7 +5465,7 @@ DltReturnValue dlt_user_log_send_log_v2(DltContextData *log, const int mtype, Dl #else struct timespec ts; if(clock_gettime(CLOCK_REALTIME, &ts) == 0) { - msg.headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg.headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg.headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg.headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg.headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); @@ -5474,7 +5474,7 @@ DltReturnValue dlt_user_log_send_log_v2(DltContextData *log, const int mtype, Dl msg.headerextrav2.nanoseconds = (uint32_t) ts.tv_nsec; /* value is long */ } }else if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - msg.headerextrav2.seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + msg.headerextrav2.seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); msg.headerextrav2.seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); msg.headerextrav2.seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); msg.headerextrav2.seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF); @@ -5617,7 +5617,7 @@ DltReturnValue dlt_user_log_send_log_v2(DltContextData *log, const int mtype, Dl /* Check filesize */ /* Return error if the file size has reached to maximum */ unsigned int msg_size = 0; - if (st.st_size < 0 || st.st_size > UINT_MAX) { + if (st.st_size < 0 || (uintmax_t)st.st_size > UINT_MAX) { dlt_vlog(LOG_ERR, "%s: File size (%lld bytes) is invalid or too large for unsigned int\n", __func__, (long long int)st.st_size); return DLT_RETURN_FILESZERR; } diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index f63d66df0..ff6ad5c74 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -1081,7 +1081,7 @@ DltReturnValue dlt_message_header_flags(DltMessage *msg, char *text, size_t text if ((flags & DLT_HEADER_SHOW_TIME) == DLT_HEADER_SHOW_TIME) { /* print received time */ - time_t tt = msg->storageheader->seconds; + time_t tt = (time_t)msg->storageheader->seconds; tzset(); localtime_r(&tt, &timeinfo); strftime (buffer, sizeof(buffer), "%Y/%m/%d %H:%M:%S", &timeinfo); @@ -3649,7 +3649,7 @@ DltReturnValue dlt_set_storageheader_v2(DltStorageHeaderV2 *storageheader, uint8 #if defined(_MSC_VER) storageheader->nanoseconds = 0; #else - storageheader->seconds[0]=(uint8_t)((ts.tv_sec >> 32) & 0xFF); + storageheader->seconds[0]=(uint8_t)(((uint64_t)ts.tv_sec >> 32) & 0xFF); storageheader->seconds[1]=(uint8_t)((ts.tv_sec >> 24) & 0xFF); storageheader->seconds[2]=(uint8_t)((ts.tv_sec >> 16) & 0xFF); storageheader->seconds[3]=(uint8_t)((ts.tv_sec >> 8) & 0xFF);