From 83bc4b162f210e4dfafca69e9b4e7735ef61405e Mon Sep 17 00:00:00 2001 From: Martine Lenders <m.lenders@fu-berlin.de> Date: Thu, 24 Jan 2019 14:05:24 +0100 Subject: [PATCH] socket_zep: fix undefined timestamp conversion behavior --- cpu/native/socket_zep/socket_zep.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cpu/native/socket_zep/socket_zep.c b/cpu/native/socket_zep/socket_zep.c index c2d5da30b6..82ec572838 100644 --- a/cpu/native/socket_zep/socket_zep.c +++ b/cpu/native/socket_zep/socket_zep.c @@ -35,6 +35,9 @@ #include "debug.h" #define _UNIX_NTP_ERA_OFFSET (2208988800U) +/* can't use timex.h's US_PER_SEC as timeval's tv_usec is signed long + * (https://pubs.opengroup.org/onlinepubs/9699919799.2016edition/basedefs/time.h.html) */ +#define TV_USEC_PER_SEC (1000000L) static size_t _zep_hdr_fill_v2_data(socket_zep_t *dev, zep_v2_data_hdr_t *hdr, size_t payload_len) @@ -49,7 +52,10 @@ static size_t _zep_hdr_fill_v2_data(socket_zep_t *dev, zep_v2_data_hdr_t *hdr, hdr->lqi_mode = 1; hdr->lqi_val = 0xff; /* TODO: set */ hdr->time.seconds = byteorder_htonl(tv.tv_sec + _UNIX_NTP_ERA_OFFSET); - hdr->time.fraction = byteorder_htonl((tv.tv_usec * 1000000) / 232); + assert(tv.tv_usec < TV_USEC_PER_SEC); + hdr->time.fraction = byteorder_htonl( + (uint32_t)((uint64_t)tv.tv_usec * TV_USEC_PER_SEC) / 232U + ); hdr->seq = byteorder_htonl(dev->seq); memset(hdr->resv, 0, sizeof(hdr->resv)); hdr->length = payload_len; -- GitLab