From f47198aa363c2cebb0fac3edb75785b03d17f604 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Tue, 12 May 2015 22:03:34 +0000 Subject: [PATCH] [lib/Fuzzer] use sha1sum for the file hash llvm-svn: 237198 --- llvm/lib/Fuzzer/FuzzerUtil.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/llvm/lib/Fuzzer/FuzzerUtil.cpp b/llvm/lib/Fuzzer/FuzzerUtil.cpp index dc7154c..2fb6e05 100644 --- a/llvm/lib/Fuzzer/FuzzerUtil.cpp +++ b/llvm/lib/Fuzzer/FuzzerUtil.cpp @@ -15,6 +15,7 @@ #include #include #include +#include namespace fuzzer { @@ -34,7 +35,36 @@ void PrintASCII(const Unit &U, const char *PrintAfter) { std::cerr << PrintAfter; } +// Try to compute a SHA1 sum of this Unit using an external 'sha1sum' command. +// We can not use the SHA1 function from openssl directly because +// a) openssl may not be available, +// b) we may be fuzzing openssl itself. +// This is all very sad, suggestions are welcome. +static std::string TrySha1(const Unit &in) { + char TempPath[] = "/tmp/fuzzer-tmp-XXXXXX"; + int FD = mkstemp(TempPath); + if (FD < 0) return ""; + ssize_t Written = write(FD, in.data(), in.size()); + close(FD); + if (static_cast(Written) != in.size()) return ""; + + std::string Cmd = "sha1sum < "; + Cmd += TempPath; + FILE *F = popen(Cmd.c_str(), "r"); + if (!F) return ""; + char Sha1[41]; + fgets(Sha1, sizeof(Sha1), F); + fclose(F); + + unlink(TempPath); + return Sha1; +} + std::string Hash(const Unit &in) { + std::string Sha1 = TrySha1(in); + if (!Sha1.empty()) + return Sha1; + size_t h1 = 0, h2 = 0; for (auto x : in) { h1 += x; -- 2.7.4