From 15538f7e3f8fdafb13b99554a8726850caeef937 Mon Sep 17 00:00:00 2001 From: Doyle Date: Tue, 19 May 2020 18:45:32 +1000 Subject: ByteSlice: Fix persisting ptr to std::moved SSO buffer The Bug: 1. Construct `byte_slice.portion_` with `epee::span(buffer)` which copies a pointer to the SSO buffer to `byte_slice.portion_` 2. It constructs `byte_slice.storage_` with `std::move(buffer)` (normally this swap pointers, but SSO means a memcpy and clear on the original SSO buffer) 3. `slice.data()` returns a pointer from `slice.portion_` that points to the original SSO cleared buffer, `slice.storage_` has the actual string. --- contrib/epee/src/byte_slice.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/epee/src/byte_slice.cpp b/contrib/epee/src/byte_slice.cpp index 99c37fae3..25fec4452 100644 --- a/contrib/epee/src/byte_slice.cpp +++ b/contrib/epee/src/byte_slice.cpp @@ -133,10 +133,13 @@ namespace epee template byte_slice::byte_slice(const adapt_buffer, T&& buffer) - : storage_(nullptr), portion_(to_byte_span(to_span(buffer))) + : storage_(nullptr), portion_(nullptr) { if (!buffer.empty()) + { storage_ = allocate_slice>(0, std::move(buffer)); + portion_ = to_byte_span(to_span(static_cast *>(storage_.get())->buffer)); + } } byte_slice::byte_slice(std::initializer_list> sources) -- cgit v1.2.3