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"}));