aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/epee/include/net/abstract_tcp_server2.inl1
-rw-r--r--contrib/epee/include/net/levin_protocol_handler_async.h16
-rw-r--r--contrib/epee/src/http_auth.cpp13
3 files changed, 24 insertions, 6 deletions
diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl
index f65435e72..814ad91b1 100644
--- a/contrib/epee/include/net/abstract_tcp_server2.inl
+++ b/contrib/epee/include/net/abstract_tcp_server2.inl
@@ -516,6 +516,7 @@ namespace net_utils
start_write();
}
});
+ return;
}
}
diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h
index 86cee9a11..756560c2a 100644
--- a/contrib/epee/include/net/levin_protocol_handler_async.h
+++ b/contrib/epee/include/net/levin_protocol_handler_async.h
@@ -481,18 +481,26 @@ public:
return false;
}
- temp = std::move(m_fragment_buffer);
- m_fragment_buffer.clear();
+ temp.swap(m_fragment_buffer);
std::memcpy(std::addressof(m_current_head), std::addressof(temp[0]), sizeof(bucket_head2));
+ const std::uint64_t inner_size = SWAP64LE(m_current_head.m_cb);
+ buff_to_invoke = {reinterpret_cast<const uint8_t*>(temp.data()) + sizeof(bucket_head2), temp.size() - sizeof(bucket_head2)};
+ if (buff_to_invoke.size() < inner_size)
+ {
+ MERROR(m_connection_context << "Invalid fragmented buffer size: " << buff_to_invoke.size() << " vs " << inner_size);
+ return false;
+ }
+
+ buff_to_invoke = {buff_to_invoke.data(), std::size_t(inner_size)};
+
const size_t max_bytes = m_connection_context.get_max_bytes(m_current_head.m_command);
- if(m_current_head.m_cb > std::min<size_t>(max_packet_size, max_bytes))
+ if(buff_to_invoke.size() > std::min<size_t>(max_packet_size, max_bytes))
{
MERROR(m_connection_context << "Maximum packet size exceed!, m_max_packet_size = " << std::min<size_t>(max_packet_size, max_bytes)
<< ", packet header received " << m_current_head.m_cb << ", command " << m_current_head.m_command
<< ", connection will be closed.");
return false;
}
- buff_to_invoke = {reinterpret_cast<const uint8_t*>(temp.data()) + sizeof(bucket_head2), temp.size() - sizeof(bucket_head2)};
}
bool is_response = (m_oponent_protocol_ver == LEVIN_PROTOCOL_VER_1 && m_current_head.m_flags&LEVIN_PACKET_RESPONSE);
diff --git a/contrib/epee/src/http_auth.cpp b/contrib/epee/src/http_auth.cpp
index 614004ffa..dfde408cb 100644
--- a/contrib/epee/src/http_auth.cpp
+++ b/contrib/epee/src/http_auth.cpp
@@ -64,6 +64,7 @@
#include <iterator>
#include <limits>
#include <openssl/evp.h>
+#include <openssl/rand.h>
#include <tuple>
#include <type_traits>
@@ -296,13 +297,21 @@ namespace
std::array<char, 8> nc{{}};
boost::copy(out, nc.data());
+
+ std::array<uint8_t, 16> rbuf{{}};
+ if (RAND_bytes(rbuf.data(), rbuf.size()) != 1)
+ return {};
+
+ const std::string cnonce = epee::string_encoding::base64_encode(rbuf.data(), rbuf.size());
const auto response = digest(
- generate_a1(digest, user), u8":", user.server.nonce, u8":", nc, u8"::auth:", digest(method, u8":", uri)
+ generate_a1(digest, user), u8":", user.server.nonce, u8":", nc, u8":", cnonce, u8":auth:", digest(method, u8":", uri)
);
+
out.clear();
init_client_value(out, Digest::name, user, uri, response);
add_field(out, u8"qop", ceref(u8"auth"));
add_field(out, u8"nc", nc);
+ add_field(out, u8"cnonce", quoted_(cnonce));
return out;
}
@@ -592,7 +601,7 @@ namespace
boost::equals((*digest).name, request.algorithm, ascii_iequal)
);
if (request.qop.empty())
- value_generator = old_algorithm<digest_type>{*digest};
+ index = boost::fusion::size(digest_algorithms);
else
{
for (auto elem = boost::make_split_iterator(request.qop, boost::token_finder(http_list_separator));