summaryrefslogtreecommitdiff
path: root/nix
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-11-25 00:01:12 +0100
committerLudovic Courtès <ludo@gnu.org>2021-11-25 00:17:21 +0100
commitf9b1bb916c284bea00dd5549a43e0894b219d650 (patch)
treefc509c1f54fcd29cf63353a2d7fd38f502b7305b /nix
parent1eb40a6dc4917f5a2e915f8b31b750dba3d378c6 (diff)
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 9dfa20a22ae0be3d3b01a7b3d422af97428c627e. * 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.
Diffstat (limited to 'nix')
-rw-r--r--nix/libstore/build.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index 5697ae5a43..f6431bb726 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -3102,7 +3102,8 @@ void SubstitutionGoal::finished()
throw Error(format("unknown hash algorithm in `%1%'") % hashStr);
case htSHA256:
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;
default:
/* The database only stores SHA256 hashes, so compute it. */