- Add upstream patch to fix occasional crashes

See https://github.com/PurpleI2P/i2pd/issues/1290
This commit is contained in:
Dmitry Marakasov
2019-02-04 17:55:30 +00:00
parent 6165d88d30
commit 320f7e418c
2 changed files with 53 additions and 0 deletions
+1
View File
@@ -3,6 +3,7 @@
PORTNAME= i2pd
PORTVERSION= 2.23.0
PORTREVISION= 1
CATEGORIES= security net-p2p
MAINTAINER= amdmi3@FreeBSD.org
@@ -0,0 +1,52 @@
From bc3f02cb6b89cb00b83439330c942006039e1cba Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Thu, 31 Jan 2019 16:03:10 -0500
Subject: [PATCH] fix #1290. copy correct size if message didn't fit previous
---
libi2pd/TunnelGateway.cpp | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/libi2pd/TunnelGateway.cpp b/libi2pd/TunnelGateway.cpp
index e6bfdd844..7d0069a93 100644
--- libi2pd/TunnelGateway.cpp
+++ libi2pd/TunnelGateway.cpp
@@ -51,6 +51,19 @@ namespace tunnel
// create fragments
const std::shared_ptr<I2NPMessage> & msg = block.data;
size_t fullMsgLen = diLen + msg->GetLength () + 2; // delivery instructions + payload + 2 bytes length
+
+ if (!messageCreated && fullMsgLen > m_RemainingSize) // check if we should complete previous message
+ {
+ size_t numFollowOnFragments = fullMsgLen / TUNNEL_DATA_MAX_PAYLOAD_SIZE;
+ // length of bytes doesn't fit full tunnel message
+ // every follow-on fragment adds 7 bytes
+ size_t nonFit = (fullMsgLen + numFollowOnFragments*7) % TUNNEL_DATA_MAX_PAYLOAD_SIZE;
+ if (!nonFit || nonFit > m_RemainingSize)
+ {
+ CompleteCurrentTunnelDataMessage ();
+ CreateCurrentTunnelDataMessage ();
+ }
+ }
if (fullMsgLen <= m_RemainingSize)
{
// message fits. First and last fragment
@@ -65,18 +78,6 @@ namespace tunnel
}
else
{
- if (!messageCreated) // check if we should complete previous message
- {
- size_t numFollowOnFragments = fullMsgLen / TUNNEL_DATA_MAX_PAYLOAD_SIZE;
- // length of bytes don't fit full tunnel message
- // every follow-on fragment adds 7 bytes
- size_t nonFit = (fullMsgLen + numFollowOnFragments*7) % TUNNEL_DATA_MAX_PAYLOAD_SIZE;
- if (!nonFit || nonFit > m_RemainingSize)
- {
- CompleteCurrentTunnelDataMessage ();
- CreateCurrentTunnelDataMessage ();
- }
- }
if (diLen + 6 <= m_RemainingSize)
{
// delivery instructions fit