[lib/Fuzzer] use sha1sum for the file hash
authorKostya Serebryany <kcc@google.com>
Tue, 12 May 2015 22:03:34 +0000 (22:03 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 12 May 2015 22:03:34 +0000 (22:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237198 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Fuzzer/FuzzerUtil.cpp

index dc7154c..2fb6e05 100644 (file)
@@ -15,6 +15,7 @@
 #include <cassert>
 #include <cstring>
 #include <signal.h>
+#include <unistd.h>
 
 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<size_t>(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;