forked from I2P_Developers/i2p.i2p
SSU2: Fix NPE in PeerState.loadFrom()
This commit is contained in:
@@ -1174,8 +1174,8 @@ public class PeerState {
|
||||
}
|
||||
|
||||
if (!anyPending) {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(_remotePeer + " nothing pending, cancelling timer");
|
||||
//if (_log.shouldLog(Log.DEBUG))
|
||||
// _log.debug(_remotePeer + " nothing pending, cancelling timer");
|
||||
_retransmitTimer = 0;
|
||||
exitFastRetransmit();
|
||||
} else {
|
||||
@@ -2191,7 +2191,7 @@ public class PeerState {
|
||||
/**
|
||||
* Transfer the basic activity/state from the old peer to the current peer
|
||||
*
|
||||
* SSU 1 only.
|
||||
* SSU 1 or 2.
|
||||
*
|
||||
* @param oldPeer non-null
|
||||
*/
|
||||
@@ -2203,45 +2203,49 @@ public class PeerState {
|
||||
_sendWindowBytes = oldPeer._sendWindowBytes;
|
||||
oldPeer._dead = true;
|
||||
|
||||
List<Long> tmp = new ArrayList<Long>();
|
||||
// AIOOBE from concurrent access
|
||||
//tmp.addAll(oldPeer._currentACKs);
|
||||
for (Long l : oldPeer._currentACKs) {
|
||||
tmp.add(l);
|
||||
if (getVersion() == 1 && oldPeer.getVersion() == 1) {
|
||||
List<Long> tmp = new ArrayList<Long>();
|
||||
// AIOOBE from concurrent access
|
||||
//tmp.addAll(oldPeer._currentACKs);
|
||||
for (Long l : oldPeer._currentACKs) {
|
||||
tmp.add(l);
|
||||
}
|
||||
oldPeer._currentACKs.clear();
|
||||
|
||||
if (!_dead) {
|
||||
_currentACKs.addAll(tmp);
|
||||
}
|
||||
|
||||
List<ResendACK> tmp3 = new ArrayList<ResendACK>();
|
||||
tmp3.addAll(oldPeer._currentACKsResend);
|
||||
oldPeer._currentACKsResend.clear();
|
||||
|
||||
if (!_dead) {
|
||||
_currentACKsResend.addAll(tmp3);
|
||||
}
|
||||
}
|
||||
oldPeer._currentACKs.clear();
|
||||
|
||||
if (!_dead) {
|
||||
_currentACKs.addAll(tmp);
|
||||
}
|
||||
if (getVersion() == oldPeer.getVersion()) {
|
||||
Map<Long, InboundMessageState> msgs = new HashMap<Long, InboundMessageState>();
|
||||
synchronized (oldPeer._inboundMessages) {
|
||||
msgs.putAll(oldPeer._inboundMessages);
|
||||
oldPeer._inboundMessages.clear();
|
||||
}
|
||||
if (!_dead) {
|
||||
synchronized (_inboundMessages) { _inboundMessages.putAll(msgs); }
|
||||
}
|
||||
msgs.clear();
|
||||
|
||||
List<ResendACK> tmp3 = new ArrayList<ResendACK>();
|
||||
tmp3.addAll(oldPeer._currentACKsResend);
|
||||
oldPeer._currentACKsResend.clear();
|
||||
|
||||
if (!_dead) {
|
||||
_currentACKsResend.addAll(tmp3);
|
||||
}
|
||||
|
||||
Map<Long, InboundMessageState> msgs = new HashMap<Long, InboundMessageState>();
|
||||
synchronized (oldPeer._inboundMessages) {
|
||||
msgs.putAll(oldPeer._inboundMessages);
|
||||
oldPeer._inboundMessages.clear();
|
||||
}
|
||||
if (!_dead) {
|
||||
synchronized (_inboundMessages) { _inboundMessages.putAll(msgs); }
|
||||
}
|
||||
msgs.clear();
|
||||
|
||||
List<OutboundMessageState> tmp2 = new ArrayList<OutboundMessageState>();
|
||||
OutboundMessageState retransmitter = null;
|
||||
synchronized (oldPeer._outboundMessages) {
|
||||
tmp2.addAll(oldPeer._outboundMessages);
|
||||
oldPeer._outboundMessages.clear();
|
||||
}
|
||||
if (!_dead) {
|
||||
synchronized (_outboundMessages) {
|
||||
_outboundMessages.addAll(tmp2);
|
||||
List<OutboundMessageState> tmp2 = new ArrayList<OutboundMessageState>();
|
||||
OutboundMessageState retransmitter = null;
|
||||
synchronized (oldPeer._outboundMessages) {
|
||||
tmp2.addAll(oldPeer._outboundMessages);
|
||||
oldPeer._outboundMessages.clear();
|
||||
}
|
||||
if (!_dead) {
|
||||
synchronized (_outboundMessages) {
|
||||
_outboundMessages.addAll(tmp2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user