Fix absl::Cord crash on Append()/Prepend() of a long string
after SetExpectedChecksum() on an empty cord

Fixes #2167

PiperOrigin-RevId: 985658722
Change-Id: Iae5b69d75dead2a063c44cc6bff583a764e957ab
diff --git a/absl/strings/cord.cc b/absl/strings/cord.cc
index 6d9dd10..1b60404 100644
--- a/absl/strings/cord.cc
+++ b/absl/strings/cord.cc
@@ -558,6 +558,7 @@
   if (src.size() <= kMaxBytesToCopy) {
     Append(absl::string_view(src));
   } else {
+    contents_.MaybeRemoveEmptyCrcNode();
     CordRep* rep = CordRepFromString(std::forward<T>(src));
     contents_.AppendTree(rep, CordzUpdateTracker::kAppendString);
   }
@@ -637,6 +638,7 @@
   if (src.size() <= kMaxBytesToCopy) {
     Prepend(absl::string_view(src));
   } else {
+    contents_.MaybeRemoveEmptyCrcNode();
     CordRep* rep = CordRepFromString(std::forward<T>(src));
     contents_.PrependTree(rep, CordzUpdateTracker::kPrependString);
   }
diff --git a/absl/strings/cord_test.cc b/absl/strings/cord_test.cc
index 1ff172e..1ae1f63 100644
--- a/absl/strings/cord_test.cc
+++ b/absl/strings/cord_test.cc
@@ -3031,6 +3031,11 @@
     [](absl::Cord& c) { c.RemoveSuffix(10); }
   },
   {
+    "append large string",
+    [](absl::Cord& c) { c.Append(std::string(1000, 'x')); },
+    [](absl::Cord& c) { c.RemoveSuffix(1000); }
+  },
+  {
     "append cord",
     [](absl::Cord& c) {
       c.Append(absl::MakeFragmentedCord({"12345", "67890"}));
@@ -3076,6 +3081,11 @@
     [](absl::Cord& c) { c.RemovePrefix(10); }
   },
   {
+    "prepend large string",
+    [](absl::Cord& c) { c.Prepend(std::string(1000, 'x')); },
+    [](absl::Cord& c) { c.RemovePrefix(1000); }
+  },
+  {
     "prepend cord",
     [](absl::Cord& c) {
       c.Prepend(absl::MakeFragmentedCord({"98765", "43210"}));