|
|
@ -695,7 +695,7 @@ namespace transport |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
auto size = bufbe16toh (buf.data () + 1); |
|
|
|
auto size = bufbe16toh (buf.data () + 1); |
|
|
|
if (size > buf.size () - 3) |
|
|
|
if (size > buf.size () - 3 || size > i2p::data::MAX_RI_BUFFER_SIZE + 1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint (eLogError, "NTCP2: Unexpected RouterInfo size ", size, " in SessionConfirmed"); |
|
|
|
LogPrint (eLogError, "NTCP2: Unexpected RouterInfo size ", size, " in SessionConfirmed"); |
|
|
|
Terminate (); |
|
|
|
Terminate (); |
|
|
@ -960,14 +960,19 @@ namespace transport |
|
|
|
case eNTCP2BlkRouterInfo: |
|
|
|
case eNTCP2BlkRouterInfo: |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint (eLogDebug, "NTCP2: RouterInfo flag=", (int)frame[offset]); |
|
|
|
LogPrint (eLogDebug, "NTCP2: RouterInfo flag=", (int)frame[offset]); |
|
|
|
auto newRi = i2p::data::netdb.AddRouterInfo (frame + offset + 1, size - 1); |
|
|
|
if (size <= i2p::data::MAX_RI_BUFFER_SIZE + 1) |
|
|
|
if (newRi) |
|
|
|
{ |
|
|
|
{ |
|
|
|
auto newRi = i2p::data::netdb.AddRouterInfo (frame + offset + 1, size - 1); |
|
|
|
auto remoteIdentity = GetRemoteIdentity (); |
|
|
|
if (newRi) |
|
|
|
if (remoteIdentity && remoteIdentity->GetIdentHash () == newRi->GetIdentHash ()) |
|
|
|
{ |
|
|
|
// peer's RouterInfo update
|
|
|
|
auto remoteIdentity = GetRemoteIdentity (); |
|
|
|
SetRemoteIdentity (newRi->GetIdentity ()); |
|
|
|
if (remoteIdentity && remoteIdentity->GetIdentHash () == newRi->GetIdentHash ()) |
|
|
|
|
|
|
|
// peer's RouterInfo update
|
|
|
|
|
|
|
|
SetRemoteIdentity (newRi->GetIdentity ()); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
LogPrint (eLogInfo, "NTCP2: RouterInfo block is too long ", size); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case eNTCP2BlkI2NPMessage: |
|
|
|
case eNTCP2BlkI2NPMessage: |
|
|
|