Changeset 7c5dfaee


Ignore:
Timestamp:
Jun 17, 2015 11:44:12 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0f4e095
Parents:
8d9cced
Message:

I2CP: More fixes after prop, w.r.t. restore after close-on-idle

  • When socket is closed, set sessionID and LS to null, close subsession and set its sessionID and LS to null
  • Checks on client side for null session ID
  • Check for null session in Destroy Session message
  • Don't kill I2CP connection due to a bad session ID in a SendMessage?, just drop the message and send a MessageStatusMessage?
  • Log tweaks
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/client/I2CPMessageProducer.java

    r8d9cced r7c5dfaee  
    3535import net.i2p.data.i2cp.SendMessageExpiresMessage;
    3636import net.i2p.data.i2cp.SessionConfig;
     37import net.i2p.data.i2cp.SessionId;
    3738import net.i2p.util.Log;
    3839
     
    155156            msg = new SendMessageMessage();
    156157        msg.setDestination(dest);
    157         msg.setSessionId(session.getSessionId());
     158        SessionId sid = session.getSessionId();
     159        if (sid == null) {
     160            _log.error(session.toString() + " send message w/o session", new Exception());
     161            return;
     162        }
     163        msg.setSessionId(sid);
    158164        msg.setNonce(nonce);
    159165        Payload data = createPayload(dest, payload, null, null, null, null);
     
    177183        SendMessageMessage msg = new SendMessageExpiresMessage(options);
    178184        msg.setDestination(dest);
    179         msg.setSessionId(session.getSessionId());
     185        SessionId sid = session.getSessionId();
     186        if (sid == null) {
     187            _log.error(session.toString() + " send message w/o session", new Exception());
     188            return;
     189        }
     190        msg.setSessionId(sid);
    180191        msg.setNonce(nonce);
    181192        Payload data = createPayload(dest, payload, null, null, null, null);
     
    353364        msg.setPrivateKey(priv);
    354365        msg.setSigningPrivateKey(signingPriv);
    355         msg.setSessionId(session.getSessionId());
     366        SessionId sid = session.getSessionId();
     367        if (sid == null) {
     368            _log.error(session.toString() + " create LS w/o session", new Exception());
     369            return;
     370        }
     371        msg.setSessionId(sid);
    356372        session.sendMessage(msg);
    357373    }
     
    382398        }
    383399        msg.setSessionConfig(cfg);
    384         msg.setSessionId(session.getSessionId());
     400        SessionId sid = session.getSessionId();
     401        if (sid == null) {
     402            _log.error(session.toString() + " update config w/o session", new Exception());
     403            return;
     404        }
     405        msg.setSessionId(sid);
    385406        session.sendMessage(msg);
    386407    }
  • core/java/src/net/i2p/client/I2PSessionImpl.java

    r8d9cced r7c5dfaee  
    503503
    504504    protected void changeState(State state) {
     505        if (_log.shouldInfo())
     506            _log.info(getPrefix() + "Change state to " + state);
    505507        synchronized (_stateLock) {
    506508            _state = state;
     
    892894        int type = message.getType();
    893895        SessionId id = message.sessionId();
    894         if (id == null || id.equals(_sessionId) ||
    895             (_sessionId == null && id != null && type == SessionStatusMessage.MESSAGE_TYPE)) {
     896        SessionId currId = _sessionId;
     897        if (id == null || id.equals(currId) ||
     898            (currId == null && id != null && type == SessionStatusMessage.MESSAGE_TYPE)) {
    896899            // it's for us
    897900            I2CPMessageHandler handler = _handlerMap.getHandler(type);
     
    11241127            changeState(State.CLOSED);
    11251128        }
     1129        synchronized (_subsessionLock) {
     1130            for (SubSession sess : _subsessions) {
     1131                sess.changeState(State.CLOSED);
     1132                sess.setSessionId(null);
     1133                sess.setLeaseSet(null);
     1134            }
     1135        }
    11261136    }
    11271137
     
    11531163            }
    11541164        }
     1165        setSessionId(null);
     1166        setLeaseSet(null);
    11551167    }
    11561168
     
    12391251        else
    12401252            buf.append(getClass().getSimpleName());
    1241         if (_sessionId != null)
    1242             buf.append(" #").append(_sessionId.getSessionId());
     1253        SessionId id = _sessionId;
     1254        if (id != null)
     1255            buf.append(" #").append(id.getSessionId());
     1256        buf.append(' ').append(_state.toString());
    12431257        buf.append("]: ");
    12441258        return buf.toString();
  • history.txt

    r8d9cced r7c5dfaee  
    99   - No UI or config support, no server support, may be added later
    1010   - Catch uncaught exceptions in ClientConnectionRunner and stop connection
     11   - When socket is closed, set sessionID and LS to null,
     12     close subsession and set its sessionID and LS to null
     13   - Checks on client side for null session ID
     14   - Check for null session in Destroy Session message
    1115
    12162015-06-13 zzz
  • router/java/src/net/i2p/router/client/ClientMessageEventListener.java

    r8d9cced r7c5dfaee  
    99 */
    1010
     11import java.util.List;
    1112import java.util.Properties;
    1213
     
    3132import net.i2p.data.i2cp.MessageId;
    3233import net.i2p.data.i2cp.MessagePayloadMessage;
     34import net.i2p.data.i2cp.MessageStatusMessage;
    3335import net.i2p.data.i2cp.ReceiveMessageBeginMessage;
    3436import net.i2p.data.i2cp.ReceiveMessageEndMessage;
     
    366368        SessionConfig cfg = _runner.getConfig(sid);
    367369        if (cfg == null) {
    368             if (_log.shouldLog(Log.ERROR))
    369                 _log.error("SendMessage w/o session: " + sid);
    370             _runner.disconnectClient("SendMessage w/o session: " + sid);
     370            List<SessionId> current = _runner.getSessionIds();
     371            String msg = "SendMessage invalid session: " + sid + " current: " + current;
     372            if (_log.shouldLog(Log.ERROR))
     373                _log.error(msg);
     374            // Just drop the message for now, don't kill the whole socket...
     375            // bugs on client side, esp. prior to 0.9.21, may cause sending
     376            // of messages before the session is established
     377            //_runner.disconnectClient(msg);
     378            // do this instead:
     379            if (sid != null && message.getNonce() > 0) {
     380                MessageStatusMessage status = new MessageStatusMessage();
     381                status.setSessionId(sid.getSessionId());
     382                status.setSize(0);
     383                status.setNonce(message.getNonce());
     384                status.setStatus(MessageStatusMessage.STATUS_SEND_FAILURE_BAD_SESSION);
     385                try {
     386                    _runner.doSend(status);
     387                } catch (I2CPMessageException ime) {
     388                    if (_log.shouldLog(Log.WARN))
     389                        _log.warn("Error writing out the message status message", ime);
     390                }
     391            }
    371392            return;
    372393        }
     
    425446    private void handleDestroySession(DestroySessionMessage message) {
    426447        SessionId id = message.getSessionId();
    427         SessionConfig cfg = _runner.getConfig(id);
    428         _runner.removeSession(id);
     448        if (id != null) {
     449            _runner.removeSession(id);
     450        } else {
     451            if (_log.shouldLog(Log.WARN))
     452                _log.warn("destroy session with null ID");
     453        }
    429454        int left = _runner.getSessionIds().size();
    430         if (left <= 0) {
     455        if (left <= 0 || id == null) {
    431456            _runner.stopRunning();
    432457        } else {
     
    447472        SessionConfig cfg = _runner.getConfig(id);
    448473        if (cfg == null) {
    449             if (_log.shouldLog(Log.ERROR))
    450                 _log.error("CreateLeaseSet w/o session: " + id);
    451             _runner.disconnectClient("CreateLeaseSet w/o session: " + id);
     474            List<SessionId> current = _runner.getSessionIds();
     475            String msg = "CreateLeaseSet invalid session: " + id + " current: " + current;
     476            if (_log.shouldLog(Log.ERROR))
     477                _log.error(msg);
     478            _runner.disconnectClient(msg);
    452479            return;
    453480        }
     
    537564        SessionConfig cfg = _runner.getConfig(id);
    538565        if (cfg == null) {
    539             if (_log.shouldLog(Log.ERROR))
    540                 _log.error("ReconfigureSession w/o session: " + id);
     566            List<SessionId> current = _runner.getSessionIds();
     567            String msg = "ReconfigureSession invalid session: " + id + " current: " + current;
     568            if (_log.shouldLog(Log.ERROR))
     569                _log.error(msg);
    541570            //sendStatusMessage(id, SessionStatusMessage.STATUS_INVALID);
    542             _runner.disconnectClient("ReconfigureSession w/o session: " + id);
     571            _runner.disconnectClient(msg);
    543572            return;
    544573        }
Note: See TracChangeset for help on using the changeset viewer.