In SNMP4JSettings.java there is the static initialisation code
…
private static ThreadFactory threadFactory = new DefaultThreadFactory();
…
private static long threadJoinTimeout = 60000L;
where DefaultThreadFactory make the call
private long joinTimeout = SNMP4JSettings.getThreadJoinTimeout();
Since threadFactory is created before threadJoinTimeout is set, joinTimeout ends up being 0 which means threads are staying alive indefinitely. The following short Java program demonstrates the problem:
import org.snmp4j.SNMP4JSettings;
import org.snmp4j.util.DefaultThreadFactory;
import java.lang.reflect.Field;public class Snmp4jJoinTimeoutBug {
public static void main(String args) throws Exception {
long configuredTimeout = SNMP4JSettings.getThreadJoinTimeout();
DefaultThreadFactory factory =
(DefaultThreadFactory) SNMP4JSettings.getThreadFactory();
Field f = DefaultThreadFactory.class.getDeclaredField(“joinTimeout”);
f.setAccessible(true);
long actualTimeout = (long) f.get(factory);System.out.println("SNMP4JSettings.threadJoinTimeout = " + configuredTimeout); System.out.println("DefaultThreadFactory.joinTimeout = " + actualTimeout); }}
This outputs:
java -cp “.;snmp4j.jar” Snmp4jJoinTimeoutBug
SNMP4JSettings.threadJoinTimeout = 60000
DefaultThreadFactory.joinTimeout = 0
Workaround is to add transport.setSocketTimeout(60000); to the code to manually set the timeout.
Impacts versions 3.9.7 and 3.9.6 at least.