diff options
author | Ludovic Courtès <ludo@gnu.org> | 2021-11-24 22:58:12 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2021-11-25 00:17:21 +0100 |
commit | 1eb40a6dc4917f5a2e915f8b31b750dba3d378c6 (patch) | |
tree | 38ff43519122814c4ccf5e414006d7b20c8763c7 | |
parent | a4cbd31c5c527e7235eae6f87a0bdbe0640b6013 (diff) | |
download | guix-1eb40a6dc4917f5a2e915f8b31b750dba3d378c6.tar.gz |
daemon: Read unsigned nar size and download size from substituter.
Fixes <https://issues.guix.gnu.org/51983>. Reported by Tobias Geerinckx-Rice <me@tobias.gr>. * nix/libstore/local-store.cc (LocalStore::querySubstitutablePathInfos): Expect 'unsigned long long' for 'downloadSize' and 'narSize'. * tests/store.scm ("substitute query and large size"): New test.
-rw-r--r-- | nix/libstore/local-store.cc | 4 | ||||
-rw-r--r-- | tests/store.scm | 34 |
2 files changed, 36 insertions, 2 deletions
diff --git a/nix/libstore/local-store.cc b/nix/libstore/local-store.cc index 675d1ba66f..d52b102343 100644 --- a/nix/libstore/local-store.cc +++ b/nix/libstore/local-store.cc @@ -907,8 +907,8 @@ void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathI assertStorePath(p); info.references.insert(p); } - info.downloadSize = getIntLineFromSubstituter<long long>(run); - info.narSize = getIntLineFromSubstituter<long long>(run); + info.downloadSize = getIntLineFromSubstituter<unsigned long long>(run); + info.narSize = getIntLineFromSubstituter<unsigned long long>(run); } } diff --git a/tests/store.scm b/tests/store.scm index 5c9f651d6c..11ca440aed 100644 --- a/tests/store.scm +++ b/tests/store.scm @@ -942,6 +942,40 @@ (build-derivations s (list d)) #f)))))) +(test-equal "substitute query and large size" + (+ 100 (expt 2 63)) ;<https://issues.guix.gnu.org/51983> + (with-store s + (let* ((size (+ 100 (expt 2 63))) ;does not fit in signed 'long long' + (item (string-append (%store-prefix) + "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bad-size"))) + ;; Create fake substituter data, to be read by 'guix substitute'. + (call-with-output-file (string-append (%substitute-directory) + "/" (store-path-hash-part item) + ".narinfo") + (lambda (port) + (format port "StorePath: ~a +URL: http://example.org +Compression: none +NarSize: ~a +NarHash: sha256:0fj9vhblff2997pi7qjj7lhmy7wzhnjwmkm2hmq6gr4fzmg10s0w +References: +System: x86_64-linux~%" + item size))) + + ;; Remove entry from the local cache. + (false-if-exception + (delete-file-recursively (string-append (getenv "XDG_CACHE_HOME") + "/guix/substitute"))) + + ;; Make sure 'guix substitute' correctly communicates the above + ;; data. + (set-build-options s #:use-substitutes? #t + #:substitute-urls (%test-substitute-urls)) + (match (pk 'spi (substitutable-path-info s (list item))) + (((? substitutable? s)) + (and (equal? (substitutable-path s) item) + (substitutable-nar-size s))))))) + (test-assert "export/import several paths" (let* ((texts (unfold (cut >= <> 10) (lambda _ (random-text)) |