fix(3p/nix/hash): smart pointers in HashSink

Change-Id: Ib2aaf42c8b234ee343c4653eb03f328c113dea86
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1492
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
This commit is contained in:
Kane York 2020-07-27 18:58:28 -07:00 committed by kanepyork
parent e8f893ee10
commit addcba11b0
2 changed files with 18 additions and 17 deletions

View file

@ -280,6 +280,8 @@ absl::StatusOr<Hash> Hash::deserialize(const std::string& s, HashType type) {
return dest;
}
namespace hash {
union Ctx {
MD5_CTX md5;
SHA_CTX sha1;
@ -324,8 +326,10 @@ static void finish(HashType ht, Ctx& ctx, unsigned char* hash) {
}
}
} // namespace hash
Hash hashString(HashType ht, const std::string& s) {
Ctx ctx{};
hash::Ctx ctx{};
Hash hash(ht);
start(ht, ctx);
update(ht, ctx, reinterpret_cast<const unsigned char*>(s.data()), s.length());
@ -334,7 +338,7 @@ Hash hashString(HashType ht, const std::string& s) {
}
Hash hashFile(HashType ht, const Path& path) {
Ctx ctx{};
hash::Ctx ctx{};
Hash hash(ht);
start(ht, ctx);
@ -357,34 +361,27 @@ Hash hashFile(HashType ht, const Path& path) {
return hash;
}
HashSink::HashSink(HashType ht) : ht(ht) {
ctx = new Ctx;
bytes = 0;
start(ht, *ctx);
}
HashSink::HashSink(HashType ht) : ht(ht), ctx(), bytes(0) { start(ht, *ctx); }
HashSink::~HashSink() {
bufPos = 0;
delete ctx;
}
HashSink::~HashSink() { bufPos = 0; }
void HashSink::write(const unsigned char* data, size_t len) {
bytes += len;
update(ht, *ctx, data, len);
nix::hash::update(ht, *ctx, data, len);
}
HashResult HashSink::finish() {
flush();
Hash hash(ht);
nix::finish(ht, *ctx, hash.hash);
nix::hash::finish(ht, *ctx, hash.hash);
return HashResult(hash, bytes);
}
HashResult HashSink::currentHash() {
flush();
Ctx ctx2 = *ctx;
nix::hash::Ctx ctx2 = *ctx;
Hash hash(ht);
nix::finish(ht, ctx2, hash.hash);
nix::hash::finish(ht, ctx2, hash.hash);
return HashResult(hash, bytes);
}

View file

@ -88,9 +88,11 @@ Hash hashString(HashType ht, const std::string& s);
/* Compute the hash of the given file. */
Hash hashFile(HashType ht, const Path& path);
/* A pair of the Hash, and the number of bytes consumed. */
typedef std::pair<Hash, unsigned long long> HashResult;
/* Compute the hash of the given path. The hash is defined as
(essentially) hashString(ht, dumpPath(path)). */
typedef std::pair<Hash, unsigned long long> HashResult;
HashResult hashPath(HashType ht, const Path& path,
PathFilter& filter = defaultPathFilter);
@ -104,12 +106,14 @@ HashType parseHashType(const std::string& s);
/* And the reverse. */
std::string printHashType(HashType ht);
namespace hash {
union Ctx;
}
class HashSink : public BufferedSink {
private:
HashType ht;
Ctx* ctx;
std::unique_ptr<hash::Ctx> ctx;
unsigned long long bytes;
public: