SSU2: Fix NPE in PeerState.loadFrom()

This commit is contained in:
zzz
2022-04-05 07:47:56 -04:00
parent 680320dede
commit 9d49dc7af7

View File

@@ -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);
}
}
}
}