FULL PRODUCT VERSION :
A DESCRIPTION OF THE PROBLEM :
Class: com.sun.jndi.ldap.EventSupport
IntelliJ decomplier code below code below:
In jdk1.7.0_80 in rt.jar
synchronized void removeNamingListener(NamingListener var1) {
Enumeration var2 = this.notifiers.elements();
while(var2.hasMoreElements()) {
NamingEventNotifier var3 = (NamingEventNotifier)var2.nextElement();
if(var3 != null) {
var3.removeNamingListener(var1);
if(!var3.hasNamingListeners()) {
var3.stop();
this.notifiers.remove(var3.info); -> Works fine, since it���s Enumeration and not iterator
}
}
}
if(this.unsolicited != null) {
this.unsolicited.removeElement(var1);
}
}
jdk1.8.0_112 in rt.jar
synchronized void removeNamingListener(NamingListener var1) {
Iterator var2 = this.notifiers.values().iterator();
while(var2.hasNext()) {
NamingEventNotifier var3 = (NamingEventNotifier)var2.next();
if(var3 != null) {
var3.removeNamingListener(var1);
if(!var3.hasNamingListeners()) {
var3.stop();
this.notifiers.remove(var3.info); -> Clearly an incorrect usage of iterator.. This throws a concurrent modification exception
}
}
}
if(this.unsolicited != null) {
this.unsolicited.removeElement(var1);
}
}
REGRESSION. Last worked in version 7u80
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Remove listener without
ACTUAL -
Not removing listener
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.util.ConcurrentModificationException: null
at java.util.Hashtable$Enumerator.next(Hashtable.java:1378)
at com.sun.jndi.ldap.EventSupport.removeNamingListener(EventSupport.java:211)
at com.sun.jndi.ldap.LdapCtx.removeNamingListener(LdapCtx.java:3445)
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
Not use the remove listener metod