11#include " source/common/http/status.h"
22
33#include " source/common/common/assert.h"
4- #include " source/common/common/safe_memcpy.h"
54
65#include " absl/strings/str_cat.h"
76
@@ -42,13 +41,11 @@ struct PrematureResponsePayload : public EnvoyStatusPayload {
4241};
4342
4443template <typename T> void storePayload (absl::Status& status, const T& payload) {
45- const size_t payload_size = sizeof (payload);
46- char * buffer = new char [payload_size];
47- safeMemcpyUnsafeDst (buffer, &payload);
48- absl::Cord cord (absl::string_view (buffer, payload_size));
44+ const T* allocated = new T (payload);
45+ const absl::string_view sv = absl::string_view (reinterpret_cast <const char *>(allocated), sizeof (allocated));
46+ absl::Cord cord = absl::MakeCordFromExternal (sv, [allocated]() { delete allocated; });
4947 cord.Flatten (); // Flatten ahead of time for easier access later.
5048 status.SetPayload (EnvoyPayloadUrl, std::move (cord));
51- free (buffer);
5249}
5350
5451template <typename T = EnvoyStatusPayload> const T& getPayload (const absl::Status& status) {
@@ -62,9 +59,7 @@ template <typename T = EnvoyStatusPayload> const T& getPayload(const absl::Statu
6259 auto data = cord.TryFlat ();
6360 ASSERT (data.has_value ()); // EnvoyPayloadUrl cords are flattened ahead of time
6461 ASSERT (data.value ().length () >= sizeof (T), " Invalid payload length" );
65- char * buffer = new char [sizeof (T)];
66- memcpy (buffer, data.value ().data (), sizeof (T)); // NOLINT(safe-memcpy)
67- payload = reinterpret_cast <const T*>(buffer);
62+ payload = reinterpret_cast <const T*>(data.value ().data ());
6863 }
6964 });
7065 ASSERT (payload);
0 commit comments