[ 
https://issues.apache.org/jira/browse/SSHD-1050?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17170599#comment-17170599
 ] 

Lyor Goldstein commented on SSHD-1050:
--------------------------------------

Actually this whole code is strange - the way I read, the {{false}} should 
never have been replaced by {{true}} so {{verify()}} should always fail - which 
it of course doesn't...

> Race condition between early exceptions and AuthFuture
> ------------------------------------------------------
>
>                 Key: SSHD-1050
>                 URL: https://issues.apache.org/jira/browse/SSHD-1050
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 2.4.0, 2.6.0
>            Reporter: Thomas Wolf
>            Priority: Major
>
> It appears that sometimes exceptions that occur early in connection setup are 
> not reported on the AuthFuture. When that happens, AuthFuture.verify(timeout) 
> will spend the whole timeout waiting and then report a timeout. The earlier 
> exception is lost and nowhere to be seen.
> I stumbled over this when analyzing [Eclipse bug 
> 565394|https://bugs.eclipse.org/bugs/show_bug.cgi?id=565394].
> It's not easy to reproduce, but with the below client test I can manage to 
> make the test fail from time to time if run repeatedly. (That test uses a 
> large preamble before the server identification to provoke an early 
> exception. Using publickey auth instead of password auth increases the 
> chances to get a failure. Running in a debugger increases the chances even 
> more. It's clearly timing-related.)
> {code:java}
>  private String longPreamble() {
>    StringBuilder b = new StringBuilder();
>    for (int i = 0; i < 250; i++) {
>      b.append('a');
>    }
>    String line = b.toString();
>    b = new StringBuilder(line);
>    int limit = CoreModuleProperties.MAX_IDENTIFICATION_SIZE.get(sshd)
>        .orElse(Integer.valueOf(16 * 1024)).intValue();
>    limit = limit / 250 + 1;
>    for (int i = 0; i < limit; i++) {
>      b.append(CoreModuleProperties.SERVER_EXTRA_IDENT_LINES_SEPARATOR)
>          .append(line);
>    }
>    return b.toString();
>  }
>  @Test
>  public void testAuthGetsNotifiedOnLongPreamble() throws Exception {
>    CoreModuleProperties.SERVER_EXTRA_IDENTIFICATION_LINES.set(sshd,
>        longPreamble());
>    sshd.setPasswordAuthenticator(RejectAllPasswordAuthenticator.INSTANCE);
>    
> sshd.setKeyboardInteractiveAuthenticator(KeyboardInteractiveAuthenticator.NONE);
>    client.setUserAuthFactories(
>        Collections.singletonList(UserAuthPublicKeyFactory.INSTANCE));
>    client.start();
>    try (ClientSession session =
>        client.connect(getCurrentTestName(), TEST_LOCALHOST, port)
>        .verify(CONNECT_TIMEOUT).getSession()) {
>      KeyPairProvider keys = createTestHostKeyProvider();
>      session.addPublicKeyIdentity(
>          keys.loadKey(session, 
> CommonTestSupportUtils.DEFAULT_TEST_HOST_KEY_TYPE));
>      // This auth should fail because the server sends too many lines before
>      // the server identification. However, the auth must not time out! 
> There's
>      // an exception raised early on when the identification is read, but
>      // frequently this exception gets not reported on the auth future that
>      // we are waiting on here, and then we wait for the whole timeout.
>      //
>      // There's a race condition somewhere. The test succeeds frequently, and 
> is
>      // hard to make fail, but if run enough times it will usually fail. 
> Running
>      // this in a debugger increases the chances of it failing.
>      Throwable e = assertThrows(Throwable.class,
>          () -> session.auth().verify(AUTH_TIMEOUT));
>      assertFalse(e.getMessage().contains("timeout"));
>      assertFalse(session.isAuthenticated());
>    } finally {
>      client.stop();
>    }
>  }
> {code}
> Perhaps the connect future should be fulfilled only once the initial KEX is 
> done? OpenSSH's ConnectTimeout does include the time until after the initial 
> KEX.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to