diff --git a/CHANGELOG.md b/CHANGELOG.md index da8fc314..1e38b972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ Version 159: * Fix typo in release notes +* Safe treatment of zero-length string arguments in basic_fields -------------------------------------------------------------------------------- diff --git a/doc/qbk/09_releases.qbk b/doc/qbk/09_releases.qbk index b1ba8698..95f8fa19 100644 --- a/doc/qbk/09_releases.qbk +++ b/doc/qbk/09_releases.qbk @@ -110,6 +110,8 @@ to update to the latest Boost release. * ([issue 1030]) Fix big-endian websocket masking +* Safe treatment of zero-length string arguments in basic_fields + [*API Changes] * Remove unintended public members of diff --git a/include/boost/beast/http/impl/fields.ipp b/include/boost/beast/http/impl/fields.ipp index 1ad25e26..9d828c80 100644 --- a/include/boost/beast/http/impl/fields.ipp +++ b/include/boost/beast/http/impl/fields.ipp @@ -272,8 +272,10 @@ writer(basic_fields const& f, template basic_fields:: value_type:: -value_type(field name, - string_view sname, string_view value) +value_type( + field name, + string_view sname, + string_view value) : off_(static_cast(sname.size() + 2)) , len_(static_cast(value.size())) , f_(name) @@ -285,8 +287,8 @@ value_type(field name, p[off_-1] = ' '; p[off_ + len_] = '\r'; p[off_ + len_ + 1] = '\n'; - std::memcpy(p, sname.data(), sname.size()); - std::memcpy(p + off_, value.data(), value.size()); + sname.copy(p, sname.size()); + value.copy(p + off_, value.size()); } template @@ -1226,7 +1228,7 @@ realloc_string(string_view& dest, string_view s) if(! s.empty()) { auto const p = a.allocate(s.size()); - std::memcpy(p, s.data(), s.size()); + s.copy(p, s.size()); dest = {p, s.size()}; } } @@ -1255,7 +1257,7 @@ realloc_target( { auto const p = a.allocate(1 + s.size()); p[0] = ' '; - std::memcpy(p + 1, s.data(), s.size()); + s.copy(p + 1, s.size()); dest = {p, 1 + s.size()}; } }