diff --git a/libi2pd_client/SAM.cpp b/libi2pd_client/SAM.cpp index fad7ea2d..89beb538 100644 --- a/libi2pd_client/SAM.cpp +++ b/libi2pd_client/SAM.cpp @@ -968,24 +968,28 @@ namespace client SendMessageReply (m_Buffer, l, false); } - const std::map SAMSocket::ExtractParams (char * buf) + const std::map SAMSocket::ExtractParams (std::string_view buf) { std::map params; - char * separator; - do - { - separator = strchr (buf, ' '); - if (separator) *separator = 0; - char * value = strchr (buf, '='); - if (value) - { - *value = 0; - value++; - params.emplace (buf, value); + size_t pos = 0; + while (pos < buf.length ()) + { + std::string_view field; + auto separator = buf.find (' ', pos); + if (separator != std::string_view::npos) + { + field = buf.substr (pos, separator - pos); + pos = separator + 1; } - buf = separator + 1; + else + { + field = buf.substr (pos); + pos = buf.length (); + } + auto value = field.find ('='); + if (value != std::string_view::npos) + params.emplace (field.substr (0, value), field.substr (value + 1)); } - while (separator); return params; } diff --git a/libi2pd_client/SAM.h b/libi2pd_client/SAM.h index acc17e20..6ff0ef02 100644 --- a/libi2pd_client/SAM.h +++ b/libi2pd_client/SAM.h @@ -152,7 +152,7 @@ namespace client void SendStreamI2PError(const std::string & msg); void SendStreamCantReachPeer(const std::string & msg); size_t ProcessDatagramSend (char * buf, size_t len, const char * data); // from SAM 1.0 - const std::map ExtractParams (char * buf); + const std::map ExtractParams (std::string_view buf); void Connect (std::shared_ptr remote, std::shared_ptr session = nullptr); void HandleConnectLeaseSetRequestComplete (std::shared_ptr leaseSet);