From: Kostya Serebryany Date: Tue, 12 May 2015 22:03:34 +0000 (+0000) Subject: [lib/Fuzzer] use sha1sum for the file hash X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b8a0c0ecb380061e76d0535c909a1f5f13cc3c10;p=oota-llvm.git [lib/Fuzzer] use sha1sum for the file hash git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237198 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Fuzzer/FuzzerUtil.cpp b/lib/Fuzzer/FuzzerUtil.cpp index dc7154ca385..2fb6e0587cf 100644 --- a/lib/Fuzzer/FuzzerUtil.cpp +++ b/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;