RFR:8205330 InitialDirContext ctor sometimes throws NPE if the server has sent a disconnection

Daniel Fuchs daniel.fuchs at oracle.com
Mon Sep 10 14:38:36 UTC 2018


Nice find Chris.

But I have to wonder why the NPE wasn't thrown at the
very beginning of `authenticate` namely one of these
two lines:

         int readTimeout = conn.readTimeout;
         conn.readTimeout = conn.connectTimeout;

which happen to be called even before ensureOpen() is
called a few lines later!

cheers,

-- daniel

On 10/09/2018 13:00, Chris Hegarty wrote:
> Vyom,
> 
> The NPE is originating from the finally block of the LdapClient
> `authenticate` method. In the finally block there is an attempt
> to restore the "read" timeout, since it was changed earlier in
> `authenticate`, to reflect the connect timeout value, since the
> subsequent operation(s) are considered part of the connect phase.
> 
> An unsolicited message may close the connection during
> authenticate, which is does and LdapClient.ldapBind throws
> "javax.naming.CommunicationException: Request: 1 cancelled". The
> finally block is then executed and the previous exception is
> effectively throw away when the NPE is encountered.
> 
> If we agree that such behaviour is reasonable ( and I think it
> most likely is ), then the finally block needs to be more
> defensive - check that conn is not null. It makes no sense to
> attempt to reset the read timeout if conn is null.
> 
> With the following change, then the CommunicationException will
> be thrown from `authenticate`. I think this is the behaviour we
> want, no?
> 
> 
> --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapClient.java
> +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapClient.java
> @@ -297,7 +297,8 @@
>               conn.setV3(isLdapv3);
>               return res;
>           } finally {
> -            conn.readTimeout = readTimeout;
> +            if (conn != null)
> +                conn.readTimeout = readTimeout;
>           }
>       }
> 
> 
> -Chris.


More information about the core-libs-dev mailing list