From 52f349b9f151c54c3e7568fd536fb9ae7d3641c8 Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Thu, 18 Jun 2026 14:13:03 +0200 Subject: [PATCH] frame_serialize: use reentrant gmtime in CBOR date decoding gmtime() returns a pointer to a shared static buffer, so concurrent deserialization of CborUnixTime_tTag values was a data race. Decode into a local struct tm via gmtime_r (gmtime_s on Windows) instead. Co-Authored-By: Claude Opus 4.8 --- frame_serialize/CBORStream2Deserializer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frame_serialize/CBORStream2Deserializer.cpp b/frame_serialize/CBORStream2Deserializer.cpp index 2a598de6..06241be0 100644 --- a/frame_serialize/CBORStream2Deserializer.cpp +++ b/frame_serialize/CBORStream2Deserializer.cpp @@ -85,8 +85,14 @@ namespace { return GetCBORString(value); else if (tag == CborUnixTime_tTag) { time_t t = GetCBORUInt(value); + struct tm tm_buf{}; +#ifdef _WIN32 + gmtime_s(&tm_buf, &t); +#else + gmtime_r(&t, &tm_buf); +#endif char buf1[255]; - strftime(buf1, sizeof(buf1), "%FT%T", gmtime(&t)); + strftime(buf1, sizeof(buf1), "%FT%T", &tm_buf); return std::string(buf1) + "Z"; } else throw JFJochException(JFJochExceptionCategory::CBORError, "Time/date tag error");