From bcf2cd4febeaa8121d3a0288de2a61c7446c761e Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Thu, 26 Feb 2026 23:51:00 +0300 Subject: [PATCH] Fix NarInfoDiskCache::queryCacheRaw on 32 bit platforms Bug has existed for a long time, but was only recently surfaced by 6733f2e5ce38b7e3f64b9529cb95b4b40acfcf42. time_t was being implicitly promoted to unsigned. Apparently time_t is still 32 bit for i686-linux in nixpkgs. Fixes https://hydra.nixos.org/build/322992746/nixlog/1 --- src/libstore/nar-info-disk-cache.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc index b5c92b637..2760bc82d 100644 --- a/src/libstore/nar-info-disk-cache.cc +++ b/src/libstore/nar-info-disk-cache.cc @@ -181,7 +181,11 @@ private: { auto i = state.caches.find(uri); if (i == state.caches.end()) { - auto queryCache(state.queryCache.use()(uri)(time(0) - settings.ttlMeta)); + /* Important: always use int64_t even on 32 bit systems. Otherwise + the the subtraction would promote time_t to unsigned if time_t is + 32 bit. */ + auto timestamp = static_cast(time(nullptr)) - static_cast(settings.ttlMeta.get()); + auto queryCache(state.queryCache.use()(uri)(timestamp)); if (!queryCache.next()) return std::nullopt; auto cache = Cache{