#Centipede Locate the crash and report the information before exiting when --exit_on_crash is set.

PiperOrigin-RevId: 547831871
diff --git a/centipede/centipede.cc b/centipede/centipede.cc
index 43414f1..71d37e8 100644
--- a/centipede/centipede.cc
+++ b/centipede/centipede.cc
@@ -318,11 +318,6 @@
         ExecuteAndReportCrash(extra_binary, input_vec, extra_batch_result) &&
         success;
   }
-  if (!success && env_.exit_on_crash) {
-    LOG(INFO) << "--exit_on_crash is enabled; exiting soon";
-    RequestEarlyExit(EXIT_FAILURE);
-    return false;
-  }
   CHECK_EQ(batch_result.results().size(), input_vec.size());
   num_runs_ += input_vec.size();
   bool batch_gained_new_coverage = false;
@@ -833,6 +828,10 @@
       CHECK(file != nullptr) << log_prefix << "Failed to open " << file_path;
       RemoteFileAppend(file, one_input);
       RemoteFileClose(file);
+      if (env_.exit_on_crash) {
+        LOG(INFO) << "--exit_on_crash is enabled; exiting soon.";
+        RequestEarlyExit(EXIT_FAILURE);
+      }
       return;
     }
   }
diff --git a/fuzztest/BUILD b/fuzztest/BUILD
index 1db39cc..8db2b13 100644
--- a/fuzztest/BUILD
+++ b/fuzztest/BUILD
@@ -103,7 +103,7 @@
         ":fixture_driver",
         ":logging",
         ":runtime",
-        "@com_google_absl//absl/strings:str_format",
+        "@com_google_absl//absl/algorithm:container",
         "@com_google_fuzztest//centipede:centipede_runner_no_main",
     ],
 )
diff --git a/fuzztest/internal/centipede_adaptor.cc b/fuzztest/internal/centipede_adaptor.cc
index f00295a..47d6927 100644
--- a/fuzztest/internal/centipede_adaptor.cc
+++ b/fuzztest/internal/centipede_adaptor.cc
@@ -25,6 +25,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "./centipede/runner_interface.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/logging.h"
@@ -66,6 +67,21 @@
     return false;
   }
 
+  void GetSeeds(
+      std::function<void(centipede::ByteSpan)> seed_callback) override {
+    std::vector<GenericDomainCorpusType> seeds =
+        fuzzer_impl_.fixture_driver_->GetSeeds();
+    absl::c_shuffle(seeds, prng_);
+    if (seeds.empty())
+      seeds.push_back(fuzzer_impl_.params_domain_->UntypedInit(prng_));
+    for (const auto& seed : seeds) {
+      const auto seed_serialized =
+          fuzzer_impl_.params_domain_->UntypedSerializeCorpus(seed).ToString();
+      seed_callback(
+          {(unsigned char*)seed_serialized.data(), seed_serialized.size()});
+    }
+  }
+
   bool Mutate(
       const std::vector<centipede::MutationInputRef>& inputs,
       size_t num_mutants,