mirror of
https://github.com/oxen-io/lokinet
synced 2023-12-14 06:53:00 +01:00
seek for version and set it before deserializing
This commit is contained in:
parent
67da33a221
commit
bdb0b847f8
17 changed files with 113 additions and 11 deletions
|
@ -8,6 +8,7 @@ namespace llarp
|
|||
DHTImmediateMessage::Clear()
|
||||
{
|
||||
msgs.clear();
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -29,6 +29,7 @@ namespace llarp
|
|||
void
|
||||
Clear() override
|
||||
{
|
||||
version = 0;
|
||||
}
|
||||
|
||||
const char*
|
||||
|
@ -68,6 +69,7 @@ namespace llarp
|
|||
void
|
||||
Clear() override
|
||||
{
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -114,6 +114,7 @@ namespace llarp
|
|||
N.Zero();
|
||||
rc.Clear();
|
||||
Z.Zero();
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -29,6 +29,14 @@ namespace llarp
|
|||
bool
|
||||
BDecode(llarp_buffer_t* buf)
|
||||
{
|
||||
// default version if not specified is 0
|
||||
uint64_t v = 0;
|
||||
// seek for version and set it if we got it
|
||||
if(BEncodeSeekDictVersion(v, buf, 'v'))
|
||||
{
|
||||
version = v;
|
||||
}
|
||||
// when we hit the code path version is set and we can tell how to decode
|
||||
return bencode_decode_dict(*this, buf);
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ namespace llarp
|
|||
pathid.Zero();
|
||||
X.Clear();
|
||||
Y.Zero();
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -67,6 +68,7 @@ namespace llarp
|
|||
pathid.Zero();
|
||||
X.Clear();
|
||||
Y.Zero();
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -37,6 +37,7 @@ namespace llarp
|
|||
LR_CommitMessage::Clear()
|
||||
{
|
||||
std::for_each(frames.begin(), frames.end(), [](auto& f) { f.Clear(); });
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -90,6 +90,7 @@ namespace llarp
|
|||
LR_StatusMessage::Clear()
|
||||
{
|
||||
std::for_each(frames.begin(), frames.end(), [](auto& f) { f.Clear(); });
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <constants/proto.hpp>
|
||||
#include <path/path_types.hpp>
|
||||
#include <util/bencode.hpp>
|
||||
#include <util/buffer.hpp>
|
||||
|
||||
namespace llarp
|
||||
|
|
|
@ -100,6 +100,8 @@ namespace llarp
|
|||
default:
|
||||
llarp::LogError("invalid routing message id: ", *strbuf.cur);
|
||||
}
|
||||
if(msg)
|
||||
msg->version = version;
|
||||
firstKey = false;
|
||||
return msg != nullptr;
|
||||
}
|
||||
|
@ -118,6 +120,11 @@ namespace llarp
|
|||
firstKey = true;
|
||||
ManagedBuffer copiedBuf(buf);
|
||||
auto& copy = copiedBuf.underlying;
|
||||
uint64_t v = 0;
|
||||
if(BEncodeSeekDictVersion(v, ©, 'V'))
|
||||
{
|
||||
version = v;
|
||||
}
|
||||
if(bencode_read_dict(*this, ©))
|
||||
{
|
||||
msg->from = from;
|
||||
|
@ -134,7 +141,8 @@ namespace llarp
|
|||
}
|
||||
if(msg)
|
||||
msg->Clear();
|
||||
msg = nullptr;
|
||||
msg = nullptr;
|
||||
version = 0;
|
||||
return result;
|
||||
}
|
||||
} // namespace routing
|
||||
|
|
|
@ -29,9 +29,9 @@ namespace llarp
|
|||
operator()(llarp_buffer_t* buffer, llarp_buffer_t* key);
|
||||
|
||||
private:
|
||||
uint64_t version = 0;
|
||||
bool firstKey{false};
|
||||
char ourKey{'\0'};
|
||||
|
||||
struct MessageHolder;
|
||||
|
||||
IMessage* msg{nullptr};
|
||||
|
|
|
@ -30,6 +30,7 @@ namespace llarp
|
|||
{
|
||||
pathLifetime = 0;
|
||||
pathCreated = 0;
|
||||
version = 0;
|
||||
}
|
||||
};
|
||||
} // namespace routing
|
||||
|
|
|
@ -22,8 +22,9 @@ namespace llarp
|
|||
void
|
||||
Clear() override
|
||||
{
|
||||
T = 0;
|
||||
L = 0;
|
||||
T = 0;
|
||||
L = 0;
|
||||
version = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -39,6 +39,7 @@ namespace llarp
|
|||
P.Zero();
|
||||
T.Clear();
|
||||
Y.Zero();
|
||||
version = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@ namespace llarp
|
|||
Clear() override
|
||||
{
|
||||
X.clear();
|
||||
_size = 0;
|
||||
_size = 0;
|
||||
version = 0;
|
||||
}
|
||||
|
||||
size_t
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include <util/bencode.h>
|
||||
#include <util/bencode.hpp>
|
||||
#include <util/logging/logger.hpp>
|
||||
#include <cstdlib>
|
||||
#include <cinttypes>
|
||||
|
@ -24,7 +24,8 @@ bencode_read_integer(struct llarp_buffer_t* buffer, uint64_t* result)
|
|||
buffer->cur++;
|
||||
|
||||
numbuf[len] = '\0';
|
||||
*result = std::strtoull(numbuf, nullptr, 10);
|
||||
if(result)
|
||||
*result = std::strtoull(numbuf, nullptr, 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -53,10 +54,12 @@ bencode_read_string(llarp_buffer_t* buffer, llarp_buffer_t* result)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
result->base = buffer->cur;
|
||||
result->cur = buffer->cur;
|
||||
result->sz = slen;
|
||||
if(result)
|
||||
{
|
||||
result->base = buffer->cur;
|
||||
result->cur = buffer->cur;
|
||||
result->sz = slen;
|
||||
}
|
||||
buffer->cur += slen;
|
||||
return true;
|
||||
}
|
||||
|
@ -92,6 +95,49 @@ bencode_write_uint64(llarp_buffer_t* buff, uint64_t i)
|
|||
return buff->write(std::begin(letter), std::end(letter));
|
||||
}
|
||||
|
||||
bool
|
||||
bencode_discard(llarp_buffer_t* buf)
|
||||
{
|
||||
if(buf->size_left() == 0)
|
||||
return true;
|
||||
switch(*buf->cur)
|
||||
{
|
||||
case 'l':
|
||||
return llarp::bencode_read_list(
|
||||
[](llarp_buffer_t* buffer, bool more) -> bool {
|
||||
if(more)
|
||||
{
|
||||
return bencode_discard(buffer);
|
||||
}
|
||||
return true;
|
||||
},
|
||||
buf);
|
||||
case 'i':
|
||||
return bencode_read_integer(buf, nullptr);
|
||||
case 'd':
|
||||
return llarp::bencode_read_dict(
|
||||
[](llarp_buffer_t* buffer, llarp_buffer_t* key) -> bool {
|
||||
if(key)
|
||||
return bencode_discard(buffer);
|
||||
return true;
|
||||
},
|
||||
buf);
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
return bencode_read_string(buf, nullptr);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
bencode_write_version_entry(llarp_buffer_t* buff)
|
||||
{
|
||||
|
|
|
@ -41,4 +41,8 @@ bencode_start_dict(llarp_buffer_t* buff);
|
|||
bool
|
||||
bencode_end(llarp_buffer_t* buff);
|
||||
|
||||
/// read next member, discard it and advance buffer
|
||||
bool
|
||||
bencode_discard(llarp_buffer_t* buf);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -370,6 +370,29 @@ namespace llarp
|
|||
return true;
|
||||
}
|
||||
|
||||
/// seek for an int in a dict with a key k used for version
|
||||
/// set v to parsed value if found
|
||||
/// this call rewinds the buffer unconditionally before return
|
||||
/// returns false only if there was
|
||||
template < typename Int_t >
|
||||
bool
|
||||
BEncodeSeekDictVersion(Int_t& v, llarp_buffer_t* buf, const byte_t k)
|
||||
{
|
||||
const auto ret = bencode_read_dict(
|
||||
[&v, k](llarp_buffer_t* buffer, llarp_buffer_t* key) -> bool {
|
||||
if(key == nullptr)
|
||||
return true;
|
||||
if(key->sz == 1 && *key->cur == k)
|
||||
{
|
||||
return bencode_read_integer(buffer, &v);
|
||||
}
|
||||
return bencode_discard(buffer);
|
||||
}, buf);
|
||||
// rewind
|
||||
buf->cur = buf->base;
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace llarp
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue