From efca102ef396a6dcf84b2a78a94d25c81be00a7f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 10 Feb 2021 00:49:25 -0800 Subject: [PATCH] ircd::m::request: Consolidate request content buffers; remove complex tls. --- include/ircd/m/request.h | 3 +- matrix/request.cc | 77 +++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/include/ircd/m/request.h b/include/ircd/m/request.h index bfbee7058..16ceb7dea 100644 --- a/include/ircd/m/request.h +++ b/include/ircd/m/request.h @@ -33,8 +33,7 @@ struct ircd::m::request struct x_matrix; static const size_t headers_max; - static conf::item generate_content_max; - static conf::item verify_content_max; + static conf::item content_max; static bool verify(const ed25519::pk &, const ed25519::sig &, const json::object &); bool verify(const ed25519::pk &, const ed25519::sig &) const; diff --git a/matrix/request.cc b/matrix/request.cc index 1c0b78105..928de686e 100644 --- a/matrix/request.cc +++ b/matrix/request.cc @@ -8,6 +8,24 @@ // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. +namespace ircd::m +{ + static unique_mutable_buffer request_content_buf; +} + +decltype(ircd::m::request::headers_max) +ircd::m::request::headers_max +{ + 32UL +}; + +decltype(ircd::m::request::content_max) +ircd::m::request::content_max +{ + { "name", "ircd.m.request.content.max" }, + { "default", long(4_MiB) }, +}; + ircd::m::request::request(const string_view &method, const string_view &uri, const mutable_buffer &body_buf, @@ -76,12 +94,6 @@ ircd::m::request::request(const string_view &origin, }; } -decltype(ircd::m::request::headers_max) -ircd::m::request::headers_max -{ - 32UL -}; - ircd::string_view ircd::m::request::operator()(const mutable_buffer &out, const vector_view &addl_headers) @@ -155,32 +167,25 @@ const return sb.completed(); } -decltype(ircd::m::request::generate_content_max) -ircd::m::request::generate_content_max -{ - { "name", "ircd.m.request.generate.content_max" }, - { "default", long(4_MiB) }, -}; - -namespace ircd::m -{ - static unique_mutable_buffer request_generate_content_buf; -} - ircd::string_view ircd::m::request::generate(const mutable_buffer &out, const ed25519::sk &sk, const string_view &pkid) const { - const ctx::critical_assertion _ca; - auto &buf{request_generate_content_buf}; - if(unlikely(buffer::size(buf) != size_t(generate_content_max))) - buf = unique_mutable_buffer + const ctx::critical_assertion ca; + if(unlikely(buffer::size(request_content_buf) != size_t(content_max))) + request_content_buf = unique_mutable_buffer { - size_t(generate_content_max), info::page_size + size_t(content_max), info::page_size }; + assert(!empty(request_content_buf)); + const mutable_buffer buf + { + request_content_buf + }; + const auto serial_size { json::serialized(*this) @@ -257,18 +262,24 @@ const return verified; } -decltype(ircd::m::request::verify_content_max) -ircd::m::request::verify_content_max -{ - { "name", "ircd.m.request.verify.content_max" }, - { "default", long(4_MiB) }, -}; - bool ircd::m::request::verify(const ed25519::pk &pk, const ed25519::sig &sig) const { + const ctx::critical_assertion ca; + if(unlikely(buffer::size(request_content_buf) != size_t(content_max))) + request_content_buf = unique_mutable_buffer + { + size_t(content_max), info::page_size + }; + + assert(!empty(request_content_buf)); + const mutable_buffer buf + { + request_content_buf + }; + // Matrix spec sez that an empty content object {} is excluded entirely // from the verification. Our JSON only excludes members if they evaluate // to undefined i.e json::object{}/string_view{} but not json::object{"{}"} @@ -278,12 +289,6 @@ const if(empty(json::get<"content"_>(*this))) json::get<"content"_>(_this) = json::object{}; - const ctx::critical_assertion ca; - thread_local unique_buffer buf - { - size_t(verify_content_max) - }; - const size_t request_size { json::serialized(_this)