From 67222ffc4c83d918ce8395aa61769eeb77df4c4d Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Tue, 6 Aug 2019 07:13:35 -0700 Subject: Export of internal Abseil changes -- 5315e7b98905922e779798f3168d98343438c134 by Derek Mauro : Fix absl::string_view::copy to throw std::out_of_range when pos > size(). Fixes https://github.com/abseil/abseil-cpp/issues/362 PiperOrigin-RevId: 261907364 GitOrigin-RevId: 5315e7b98905922e779798f3168d98343438c134 Change-Id: Ia8ab971c54f287411f6ea4b99f9c666c989c33fd --- absl/strings/string_view.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'absl/strings/string_view.h') diff --git a/absl/strings/string_view.h b/absl/strings/string_view.h index 65b1772..25a4d1e 100644 --- a/absl/strings/string_view.h +++ b/absl/strings/string_view.h @@ -50,6 +50,7 @@ using std::string_view; #include "absl/base/internal/throw_delegate.h" #include "absl/base/macros.h" +#include "absl/base/optimization.h" #include "absl/base/port.h" namespace absl { @@ -334,7 +335,17 @@ class string_view { // // Copies the contents of the `string_view` at offset `pos` and length `n` // into `buf`. - size_type copy(char* buf, size_type n, size_type pos = 0) const; + size_type copy(char* buf, size_type n, size_type pos = 0) const { + if (ABSL_PREDICT_FALSE(pos > length_)) { + base_internal::ThrowStdOutOfRange("absl::string_view::copy"); + } + size_type rlen = (std::min)(length_ - pos, n); + if (rlen > 0) { + const char* start = ptr_ + pos; + std::copy(start, start + rlen, buf); + } + return rlen; + } // string_view::substr() // -- cgit v1.2.3