From d1230c72182f8ac61bb5de1ddf875719be9541a5 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Thu, 2 May 2024 03:09:51 +0200 Subject: [PATCH] libutil: remove RewritingSink match/size tracking size tracking can be done with a LengthSink and a tee. match tracking was defeated by never having done any match tracking, all users would see the same (empty) set of matches at all times. match tracking with bytes offsets alone would not be sufficient in the general case, only because computeHashModulo uses a single rewrite would it have worked. Change-Id: Idb214b5222e0ea24f450f5505712a342b63d7570 --- src/libutil/references.cc | 14 +++++++------- src/libutil/references.hh | 3 --- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/libutil/references.cc b/src/libutil/references.cc index 249c78bf7..c74841c56 100644 --- a/src/libutil/references.cc +++ b/src/libutil/references.cc @@ -96,15 +96,12 @@ void RewritingSink::operator () (std::string_view data) auto consumed = s.size() - prev.size(); - pos += consumed; - if (consumed) nextSink(s.substr(0, consumed)); } void RewritingSink::flush() { if (prev.empty()) return; - pos += prev.size(); nextSink(prev); prev.clear(); } @@ -112,20 +109,23 @@ void RewritingSink::flush() HashResult computeHashModulo(HashType ht, const std::string & modulus, Source & source) { HashSink hashSink(ht); + LengthSink lengthSink; RewritingSink rewritingSink(modulus, std::string(modulus.size(), 0), hashSink); - source.drainInto(rewritingSink); + TeeSink tee{rewritingSink, lengthSink}; + source.drainInto(tee); rewritingSink.flush(); /* Hash the positions of the self-references. This ensures that a NAR with self-references and a NAR with some of the self-references already zeroed out do not produce a hash collision. FIXME: proof. */ - for (auto & pos : rewritingSink.matches) - hashSink(fmt("|%d", pos)); + // NOTE(horrors) actually, RewritinSink never tracked any matches. + //for (auto & pos : rewritingSource.matches) + // hashSink(fmt("|%d", pos)); auto h = hashSink.finish(); - return {h.first, rewritingSink.pos}; + return {h.first, lengthSink.length}; } } diff --git a/src/libutil/references.hh b/src/libutil/references.hh index 970d2d235..3fefd824b 100644 --- a/src/libutil/references.hh +++ b/src/libutil/references.hh @@ -29,9 +29,6 @@ struct RewritingSink : Sink std::string::size_type maxRewriteSize; std::string prev; Sink & nextSink; - uint64_t pos = 0; - - std::vector matches; RewritingSink(const std::string & from, const std::string & to, Sink & nextSink); RewritingSink(const StringMap & rewrites, Sink & nextSink);