Not an LDAP expert, but I see that abandonRequest() still wants to write into outStream. If the SASL/GSS context is already disposed by now what stream should this be? Should it be reverted back to the raw stream?
Thanks, Weijun > On Jun 12, 2025, at 12:42, Osipov, Michael (IN IT IN) > <michael.osi...@innomotics.com> wrote: > >> Hi Michael, >> Please share a working copy of the code to duplicate the failure scenario of >> NPE related to Connection.java. BTW, I checked the stack trace posted on >> April 28 it did not clearly show Connection::cleanup got called. Was there >> something missed? > > Hi Weibing, > > apologies, it took me some time to respond. Here is the Java code in > question: https://gist.github.com/michael-o/8cff749d3ce5536bf70a16a64819cf10. > Please also find here some screenshots > (https://people.freebsd.org/~michaelo/ad-gssapi-tls-npe/) from my debugger > showing the cause. > > There is, indeed, something you missed: The Connection object is run > asynchronously is a separate thread. ::run() invokes the SASL input stream > which throws an IOE because the SASL receive buffer size is too large. The > exception is caught and swallowed. finally{} is called, it calls ::cleanup(). > Meanwhile the LDAP client receives the connection closure from the server, > the client tries to abandon the request and invokes the SASL client which is > already disposed by the connection. Therefore you don't see the > Connection::cleanup() method in the stack trace. If you pay a close look at > the output of ldapsearch(1) you will see that there are two errors: (1) the > buffer size mismatch and (2) the connection closure from the server. The > first issue causes the second to fail in JNDI/LDAP. > > Michael