From 5c5751b49e1d90ebfbd5d41f12ca35cbf06e9fee Mon Sep 17 00:00:00 2001 From: anonimal Date: Fri, 5 May 2017 23:22:07 +0000 Subject: [PATCH] RouterInfo: add exception handling to buffer creator --- src/core/router/info.cc | 44 ++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/core/router/info.cc b/src/core/router/info.cc index 7b54fe2b..65eea1fb 100644 --- a/src/core/router/info.cc +++ b/src/core/router/info.cc @@ -627,26 +627,34 @@ const std::uint8_t* RouterInfo::LoadBuffer() void RouterInfo::CreateBuffer(const PrivateKeys& private_keys) { - // Create RI - core::StringStream router_info; - CreateRouterInfo(router_info, private_keys); - if (router_info.Str().size() > Size::MaxBuffer) - throw std::length_error("RouterInfo: created RI is too big"); - - // Create buffer - m_BufferLen = router_info.Str().size(); - if (!m_Buffer) - m_Buffer = std::make_unique(Size::MaxBuffer); - std::memcpy(m_Buffer.get(), router_info.Str().c_str(), m_BufferLen); + try + { + // Create RI + core::StringStream router_info; + CreateRouterInfo(router_info, private_keys); + if (router_info.Str().size() > Size::MaxBuffer) + throw std::length_error("created RI is too big"); + + // Create buffer + m_BufferLen = router_info.Str().size(); + if (!m_Buffer) + m_Buffer = std::make_unique(Size::MaxBuffer); + std::memcpy(m_Buffer.get(), router_info.Str().c_str(), m_BufferLen); - // Signature - // TODO(anonimal): signing should be done when creating RI, not after. Requires other refactoring. - private_keys.Sign( - reinterpret_cast(m_Buffer.get()), - m_BufferLen, - reinterpret_cast(m_Buffer.get()) + m_BufferLen); + // Signature + // TODO(anonimal): signing should be done when creating RI, not after. Requires other refactoring. + private_keys.Sign( + reinterpret_cast(m_Buffer.get()), + m_BufferLen, + reinterpret_cast(m_Buffer.get()) + m_BufferLen); - m_BufferLen += private_keys.GetPublic().GetSignatureLen(); + m_BufferLen += private_keys.GetPublic().GetSignatureLen(); + } + catch (...) + { + m_Exception.Dispatch(__func__); + throw; + } } // TODO(anonimal): debug + trace logging