* [PATCH v5 1/4] libuuid: simplify gregorian-to-unix offset calculation
2025-12-29 3:50 [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Kiran Rangoon
@ 2025-12-29 3:50 ` Kiran Rangoon
2025-12-29 3:50 ` [PATCH v5 2/4] libuuid: refactor gregorian_to_unix to populate timeval directly Kiran Rangoon
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kiran Rangoon @ 2025-12-29 3:50 UTC (permalink / raw)
To: util-linux; +Cc: thomas, Kiran Rangoon
Replace complex bit-shift offset calculation with a simple constant
definition for better readability and maintainability.
Signed-off-by: Kiran Rangoon <kiranrangoon0@gmail.com>
---
libuuid/src/uuid_time.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libuuid/src/uuid_time.c b/libuuid/src/uuid_time.c
index c7516152b..e2b991d74 100644
--- a/libuuid/src/uuid_time.c
+++ b/libuuid/src/uuid_time.c
@@ -62,7 +62,8 @@ time_t __uuid_time(const uuid_t uu, struct timeval *ret_tv);
static uint64_t gregorian_to_unix(uint64_t ts)
{
- return ts - ((((uint64_t) 0x01B21DD2) << 32) + 0x13814000);
+ const uint64_t offset = 0x01B21DD213814000ULL;
+ return ts - offset;
}
static void uuid_time_v1(const struct uuid *uuid, struct timeval *tv)
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v5 2/4] libuuid: refactor gregorian_to_unix to populate timeval directly
2025-12-29 3:50 [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Kiran Rangoon
2025-12-29 3:50 ` [PATCH v5 1/4] libuuid: simplify gregorian-to-unix offset calculation Kiran Rangoon
@ 2025-12-29 3:50 ` Kiran Rangoon
2025-12-29 3:50 ` [PATCH v5 3/4] libuuid: fix timestamp overflow for pre-1970 dates Kiran Rangoon
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Kiran Rangoon @ 2025-12-29 3:50 UTC (permalink / raw)
To: util-linux; +Cc: thomas, Kiran Rangoon
Change function signature to take struct timeval pointer and populate
it directly, eliminating duplicate conversion code in callers.
Signed-off-by: Kiran Rangoon <kiranrangoon0@gmail.com>
---
libuuid/src/uuid_time.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/libuuid/src/uuid_time.c b/libuuid/src/uuid_time.c
index e2b991d74..2f7c6652c 100644
--- a/libuuid/src/uuid_time.c
+++ b/libuuid/src/uuid_time.c
@@ -60,10 +60,12 @@
/* prototype to make compiler happy */
time_t __uuid_time(const uuid_t uu, struct timeval *ret_tv);
-static uint64_t gregorian_to_unix(uint64_t ts)
+static void gregorian_to_unix(uint64_t ts, struct timeval *tv)
{
const uint64_t offset = 0x01B21DD213814000ULL;
- return ts - offset;
+ uint64_t clock_reg = ts - offset;
+ tv->tv_sec = clock_reg / 10000000;
+ tv->tv_usec = (clock_reg % 10000000) / 10;
}
static void uuid_time_v1(const struct uuid *uuid, struct timeval *tv)
@@ -74,9 +76,7 @@ static void uuid_time_v1(const struct uuid *uuid, struct timeval *tv)
high = uuid->time_mid | ((uuid->time_hi_and_version & 0xFFF) << 16);
clock_reg = uuid->time_low | ((uint64_t) high << 32);
- clock_reg = gregorian_to_unix(clock_reg);
- tv->tv_sec = clock_reg / 10000000;
- tv->tv_usec = (clock_reg % 10000000) / 10;
+ gregorian_to_unix(clock_reg, tv);
}
static void uuid_time_v6(const struct uuid *uuid, struct timeval *tv)
@@ -89,9 +89,7 @@ static void uuid_time_v6(const struct uuid *uuid, struct timeval *tv)
clock_reg <<= 12;
clock_reg |= uuid->time_hi_and_version & 0xFFF;
- clock_reg = gregorian_to_unix(clock_reg);
- tv->tv_sec = clock_reg / 10000000;
- tv->tv_usec = (clock_reg % 10000000) / 10;
+ gregorian_to_unix(clock_reg, tv);
}
static void uuid_time_v7(const struct uuid *uuid, struct timeval *tv)
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v5 3/4] libuuid: fix timestamp overflow for pre-1970 dates
2025-12-29 3:50 [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Kiran Rangoon
2025-12-29 3:50 ` [PATCH v5 1/4] libuuid: simplify gregorian-to-unix offset calculation Kiran Rangoon
2025-12-29 3:50 ` [PATCH v5 2/4] libuuid: refactor gregorian_to_unix to populate timeval directly Kiran Rangoon
@ 2025-12-29 3:50 ` Kiran Rangoon
2025-12-29 3:51 ` [PATCH v5 4/4] tests: correct UUID timestamp test expectations Kiran Rangoon
2026-01-05 13:35 ` [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Karel Zak
4 siblings, 0 replies; 6+ messages in thread
From: Kiran Rangoon @ 2025-12-29 3:50 UTC (permalink / raw)
To: util-linux; +Cc: thomas, Kiran Rangoon
Use int64_t arithmetic to correctly handle timestamps before Unix epoch.
This fixes the overflow that was causing UUID timestamps from 1582 to
appear as far-future dates. Update test expectations accordingly.
Signed-off-by: Kiran Rangoon <kiranrangoon0@gmail.com>
---
libuuid/src/uuid_time.c | 2 +-
tests/expected/uuid/uuidparse | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libuuid/src/uuid_time.c b/libuuid/src/uuid_time.c
index 2f7c6652c..63179fd76 100644
--- a/libuuid/src/uuid_time.c
+++ b/libuuid/src/uuid_time.c
@@ -63,7 +63,7 @@ time_t __uuid_time(const uuid_t uu, struct timeval *ret_tv);
static void gregorian_to_unix(uint64_t ts, struct timeval *tv)
{
const uint64_t offset = 0x01B21DD213814000ULL;
- uint64_t clock_reg = ts - offset;
+ int64_t clock_reg = (int64_t)(ts - offset);
tv->tv_sec = clock_reg / 10000000;
tv->tv_usec = (clock_reg % 10000000) / 10;
}
diff --git a/tests/expected/uuid/uuidparse b/tests/expected/uuid/uuidparse
index 9edb05e4e..e44964b30 100644
--- a/tests/expected/uuid/uuidparse
+++ b/tests/expected/uuid/uuidparse
@@ -11,7 +11,7 @@ UUID VARIANT TYPE TIME
00000000-0000-3000-8000-000000000000 DCE name-based
00000000-0000-4000-8000-000000000000 DCE random
00000000-0000-5000-8000-000000000000 DCE sha1-based
-00000000-0000-6000-8000-000000000000 DCE time-v6 60038-03-11 05:36:10,955161+00:00
+00000000-0000-6000-8000-000000000000 DCE time-v6 1582-10-15 00:00:00,000000+00:00
00000000-0000-0000-d000-000000000000 Microsoft
00000000-0000-1000-d000-000000000000 Microsoft
00000000-0000-2000-d000-000000000000 Microsoft
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v5 4/4] tests: correct UUID timestamp test expectations
2025-12-29 3:50 [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Kiran Rangoon
` (2 preceding siblings ...)
2025-12-29 3:50 ` [PATCH v5 3/4] libuuid: fix timestamp overflow for pre-1970 dates Kiran Rangoon
@ 2025-12-29 3:51 ` Kiran Rangoon
2026-01-05 13:35 ` [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Karel Zak
4 siblings, 0 replies; 6+ messages in thread
From: Kiran Rangoon @ 2025-12-29 3:51 UTC (permalink / raw)
To: util-linux; +Cc: thomas, Kiran Rangoon
Update expected timestamps for additional test UUIDs to match actual
output. These test cases provide coverage for various timestamp ranges
including pre-epoch, historical, and far-future dates.
Signed-off-by: Kiran Rangoon <kiranrangoon0@gmail.com>
---
tests/expected/uuid/uuidparse | 3 +++
tests/ts/uuid/uuidparse | 3 +++
2 files changed, 6 insertions(+)
diff --git a/tests/expected/uuid/uuidparse b/tests/expected/uuid/uuidparse
index e44964b30..61b49ef66 100644
--- a/tests/expected/uuid/uuidparse
+++ b/tests/expected/uuid/uuidparse
@@ -29,6 +29,9 @@ UUID VARIANT TYPE TIME
9b274c46-544a-11e7-a972-00037f500001 DCE time-based 2017-06-18 17:21:46,544647+00:00
1ec9414c-232a-6b00-b3c8-9f6bdeced846 DCE time-v6 2022-02-22 19:22:22,000000+00:00
017f22e2-79b2-7cc3-98c4-dc0c0c07398f DCE time-v7 2022-02-22 19:22:22,002000+00:00
+bf2eb110-d788-1003-aa59-ce1e9e293641 DCE time-based 1586-03-19 15:05:26,3611398+00:00
+f81d4fae-7dec-11d0-a765-00a0c91e6bf6 DCE time-based 1997-02-03 17:43:12,216875+00:00
+01234567-89ab-1def-8000-123456789abc DCE time-based 4764-11-18 19:35:47,841162+00:00
5c146b14-3c52-8afd-938a-375d0df1fbf6 DCE vendor
invalid-input invalid invalid invalid
return value: 0
diff --git a/tests/ts/uuid/uuidparse b/tests/ts/uuid/uuidparse
index 2903ce56d..f131986ba 100755
--- a/tests/ts/uuid/uuidparse
+++ b/tests/ts/uuid/uuidparse
@@ -56,6 +56,9 @@ echo '00000000-0000-0000-0000-000000000000
9b274c46-544a-11e7-a972-00037f500001
1ec9414c-232a-6b00-b3c8-9f6bdeced846
017f22e2-79b2-7cc3-98c4-dc0c0c07398f
+bf2eb110-d788-1003-aa59-ce1e9e293641
+f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+01234567-89ab-1def-8000-123456789abc
5c146b14-3c52-8afd-938a-375d0df1fbf6
invalid-input' | $TS_CMD_UUIDPARSE >> $TS_OUTPUT 2>> $TS_ERRLOG
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow
2025-12-29 3:50 [PATCH v5 0/4] libuuid: Fix pre-1970 UUID timestamp overflow Kiran Rangoon
` (3 preceding siblings ...)
2025-12-29 3:51 ` [PATCH v5 4/4] tests: correct UUID timestamp test expectations Kiran Rangoon
@ 2026-01-05 13:35 ` Karel Zak
4 siblings, 0 replies; 6+ messages in thread
From: Karel Zak @ 2026-01-05 13:35 UTC (permalink / raw)
To: Kiran Rangoon; +Cc: util-linux, thomas
On Sun, Dec 28, 2025 at 10:50:56PM -0500, Kiran Rangoon wrote:
> Kiran Rangoon (4):
> libuuid: simplify gregorian-to-unix offset calculation
> libuuid: refactor gregorian_to_unix to populate timeval directly
> libuuid: fix timestamp overflow for pre-1970 dates
> tests: correct UUID timestamp test expectations
Applied (from PR created by Thomas). Thanks to both for all the work!
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply [flat|nested] 6+ messages in thread