bssl::Span::subspan: split into two overloads. This removes the runtime checking of whether the length is the sentinel value `dynamic_extent`. Update-Note: `bssl::Span::subspan` no longer allows an explicit second argument of `dynamic_extent`. Previous `sp.subspan(pos, len)` can be expressed as `len == bssl::dynamic_extent ? sp.subspan(pos) : sp.subspan(pos, len)` if necessary. Change-Id: I3a344a19d01da31ef91471bfbe4977ab75495680 Bug: 453872746 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/84027 Auto-Submit: Rudolf Polzer <rpolzer@google.com> Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: Rudolf Polzer <rpolzer@google.com>
diff --git a/include/openssl/span.h b/include/openssl/span.h index 85d84e4..428a9f3 100644 --- a/include/openssl/span.h +++ b/include/openssl/span.h
@@ -254,14 +254,23 @@ public: // NOTE: This method may abort() at runtime if pos or len are out of range. - constexpr Span<T> subspan(size_t pos = 0, size_t len = dynamic_extent) const { + // NOTE: As opposed to std::span, the |dynamic_extent| value of |len| is not + // magical here. This gets rid of a lot of runtime checks. + constexpr Span<T> subspan(size_t pos, size_t len) const { // absl::Span throws an exception here. Note std::span and Chromium // base::span forbid pos + len being out of range, with a special case at // npos/dynamic_extent, whereas absl::Span::subspan clips the span. This // implements the std::span behavior which is more strict. BSSL_CHECK(pos <= size()); - BSSL_CHECK(len == dynamic_extent || len <= size() - pos); - return Span<T>(data() + pos, SubspanOutLen(size(), pos, len)); + BSSL_CHECK(len <= size() - pos); + return Span<T>(data() + pos, len); + } + + // NOTE: This method may abort() at runtime if pos is out of range. + constexpr Span<T> subspan(size_t pos) const { + // absl::Span throws an exception here. + BSSL_CHECK(pos <= size()); + return Span<T>(data() + pos, size() - pos); } // NOTE: This method may abort() at runtime if len is out of range.
diff --git a/pki/input.h b/pki/input.h index 7629055..250a6d4 100644 --- a/pki/input.h +++ b/pki/input.h
@@ -95,9 +95,12 @@ constexpr uint8_t operator[](size_t idx) const { return data_[idx]; } constexpr uint8_t front() const { return data_.front(); } constexpr uint8_t back() const { return data_.back(); } - constexpr Input subspan(size_t pos = 0, size_t len = dynamic_extent) const { + constexpr Input subspan(size_t pos, size_t len) const { return Input(data_.subspan(pos, len)); } + constexpr Input subspan(size_t pos) const { + return Input(data_.subspan(pos)); + } constexpr Input first(size_t len) const { return Input(data_.first(len)); } constexpr Input last(size_t len) const { return Input(data_.last(len)); }