Thread leak by LdapLoginModule

Sean Mullan sean.mullan at oracle.com
Tue Jun 9 22:21:50 UTC 2020


Adding core-libs-dev ...

--Sean

On 6/9/20 5:15 PM, Mkrtchyan, Tigran wrote:
> 
> Hi all,
> 
> with Java-11 we have notice a thread leak with ldap module.
> We use LDAP to authenticate users with username+pasword by
> directly calling LdapLoginModule. This was ok with java 7 and
> java 8. With java 11 we see threads getting accumulated. here is a
> test case that demonstrates it:
> 
> ```
> 
>      private static final String USERNAME_KEY = "javax.security.auth.login.name";
>      private static final String PASSWORD_KEY = "javax.security.auth.login.password";
> 
>      String ldapUrl = "ldap://....";
>      String peopleOU = "ou= ... o= ... c=...");
> 
>     String user = ...;
>     String pass = ...;
> 
> 
>      @Test
>      public void threadLeakTest() throws AuthenticationException, NoSuchPrincipalException, LoginException {
> 
>          Map<Thread, StackTraceElement[]> threadsBefore = Thread.getAllStackTraces();
> 
>          Map<String, Object>  globalLoginOptions = Map.of(
>                  "userProvider", ldapUrl + "/" + peopleOU,
>                  "useSSL", "false",
>                  "userFilter", "(uid={USERNAME})",
>                  "useFirstPass", "true"
>          );
> 
>          for (int i = 0; i < 10; i++) {
> 
>              Map<String, Object> loginOptions = Map.of(
>                      USERNAME_KEY, user,
>                      PASSWORD_KEY, pass.toCharArray());
> 
>              Subject subject = new Subject();
> 
>              LdapLoginModule loginModule = new LdapLoginModule();
>              loginModule.initialize(subject, null, loginOptions, globalLoginOptions);
>              loginModule.login();
>              loginModule.commit();
>              loginModule.logout();
>          }
> 
>          Map<Thread, StackTraceElement[]> threadsAfter = Thread.getAllStackTraces();
> 
>          assertEquals("Thread leak detected",  threadsBefore.size() + 1, threadsAfter.size());
>      }
> 
> ```
> 
> The thread count difference is always equals to the number of iterations in the loop, e.g. on each call a
> thread is created and stays around. Eventually our server crashes with:
> 
> [19497.011s][warning][os,thread] Attempt to protect stack guard pages failed (0x00007fcc4c65c000-0x00007fcc4c660000).
> OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007fcc4c55b000, 16384, 0) failed; error='Not enough space' (errno=12)
> 
> The issue is not observed with java-14, thus I assume that the fix is related to commit
> 
> http://hg.openjdk.java.net/jdk/jdk/rev/6717d7e59db4
> 
> As java-11 is LTS, what is the procedure to get it fix back-ported?
> 
> Regards,
>     Tigran.
> 


More information about the core-libs-dev mailing list