daemon: Read substitute nar size as 'unsigned long long'.
Fixes <https://issues.guix.gnu.org/46212>.
Reported by Christopher Baines <mail@cbaines.net>.
Previously, the nar size returned by 'guix substitute' would be read as
an 'int'; thus, values above 2^31 - 1 would be read and then stored as
negative integers in the database.
Regression introduced in 9dfa20a22a
.
* nix/libstore/build.cc (SubstitutionGoal::finished): Use templatized
'string2Int' instead of 'std::atoi' to get an 'unsigned long long',
which is the type of 'hash.second'.
* tests/store.scm ("substitute and large size"): New test.
master
parent
1eb40a6dc4
commit
f9b1bb916c
|
@ -3102,7 +3102,8 @@ void SubstitutionGoal::finished()
|
||||||
throw Error(format("unknown hash algorithm in `%1%'") % hashStr);
|
throw Error(format("unknown hash algorithm in `%1%'") % hashStr);
|
||||||
case htSHA256:
|
case htSHA256:
|
||||||
hash.first = parseHash16or32(hashType, string(hashStr, n + 1));
|
hash.first = parseHash16or32(hashType, string(hashStr, n + 1));
|
||||||
hash.second = std::atoi(statusList[2].c_str());
|
if (!string2Int(statusList[2], hash.second))
|
||||||
|
throw Error(format("invalid nar size for '%1%' substitute") % storePath);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* The database only stores SHA256 hashes, so compute it. */
|
/* The database only stores SHA256 hashes, so compute it. */
|
||||||
|
|
|
@ -976,6 +976,50 @@ System: x86_64-linux~%"
|
||||||
(and (equal? (substitutable-path s) item)
|
(and (equal? (substitutable-path s) item)
|
||||||
(substitutable-nar-size s)))))))
|
(substitutable-nar-size s)))))))
|
||||||
|
|
||||||
|
(test-equal "substitute and large size"
|
||||||
|
(+ 100 (expt 2 31)) ;<https://issues.guix.gnu.org/46212>
|
||||||
|
(with-store s
|
||||||
|
(let* ((size (+ 100 (expt 2 31))) ;does not fit in signed 'int'
|
||||||
|
(item (string-append (%store-prefix)
|
||||||
|
"/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bad-size-"
|
||||||
|
(random-text)))
|
||||||
|
(nar (string-append (%substitute-directory) "/nar")))
|
||||||
|
;; Create a dummy nar to allow for substitution.
|
||||||
|
(call-with-output-file nar
|
||||||
|
(lambda (port)
|
||||||
|
(write-file-tree (store-path-package-name item) port
|
||||||
|
#:file-type+size (lambda _
|
||||||
|
(values 'regular 12))
|
||||||
|
#:file-port (lambda _
|
||||||
|
(open-input-string "Hello world.")))))
|
||||||
|
|
||||||
|
;; 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: file://~a
|
||||||
|
Compression: none
|
||||||
|
NarSize: ~a
|
||||||
|
NarHash: sha256:~a
|
||||||
|
References:
|
||||||
|
System: x86_64-linux~%"
|
||||||
|
item nar size
|
||||||
|
(bytevector->nix-base32-string (gcrypt:file-sha256 nar)))))
|
||||||
|
|
||||||
|
;; 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))
|
||||||
|
(ensure-path s item)
|
||||||
|
(path-info-nar-size (query-path-info s item)))))
|
||||||
|
|
||||||
(test-assert "export/import several paths"
|
(test-assert "export/import several paths"
|
||||||
(let* ((texts (unfold (cut >= <> 10)
|
(let* ((texts (unfold (cut >= <> 10)
|
||||||
(lambda _ (random-text))
|
(lambda _ (random-text))
|
||||||
|
|
Reference in New Issue