[SNMP4J] IOException:Unexpected end of input stream at position 1

Hi Team,

We are getting IOException:Unexpected end of input stream at position 1 error while listening udp packet in 162 port. So runtime exception is getting fulled in /var/log/message section in 3 hr and every time we have to cleanup this message file . Basically customer device sends any corrupt udp packet in 162 port and snmp4j api will not be process also we are not able to handle this below run time exception in our java code using snmp4j jar.

So Is there any way we can handle this below exception and it will not throw this exception and we can gracefully handle this and by pass this exception to some custom exception to customer.

Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BERInputStream.read(BERInputStream.java:59)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeLength(BER.java:585)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeHeader(BER.java:650)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:370)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:350)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.MultiThreadedMessageDispatcher$MessageTask.run(MultiThreadedMessageDispatcher.java:182)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.ThreadPool$TaskManager.run(ThreadPool.java:310)
Jan 27 05:10:52 balabrlya01 java[2450]: java.io.IOException: Unexpected end of input stream at position 1
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BERInputStream.read(BERInputStream.java:59)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeLength(BER.java:585)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeHeader(BER.java:650)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:370)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:350)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.MultiThreadedMessageDispatcher$MessageTask.run(MultiThreadedMessageDispatcher.java:182)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.ThreadPool$TaskManager.run(ThreadPool.java:310)
Jan 27 05:10:52 balabrlya01 java[2450]: java.io.IOException: Unexpected end of input stream at position 1
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BERInputStream.read(BERInputStream.java:59)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeLength(BER.java:585)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.asn1.BER.decodeHeader(BER.java:650)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:370)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.MessageDispatcherImpl.processMessage(MessageDispatcherImpl.java:350)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.MultiThreadedMessageDispatcher$MessageTask.run(MultiThreadedMessageDispatcher.java:182)
Jan 27 05:10:52 balabrlya01 java[2450]: at org.snmp4j.util.ThreadPool$TaskManager.run(ThreadPool.java:310)

Thanks,

Ajit Sharma

You can set SNMP4JSettings.forwardRuntimeExceptions to false to ignore such errors or/and you can write your own MessageDispatcherImpl wrapper that catches and handles such errors.

Hi Frank,

As per your suggestion we saw that by default setForwardRuntimeExceptions is false.
Do we need to set it as true for not throwing exception to java console.

public static void setForwardRuntimeExceptions(boolean forwardExceptions)

Enables or disables runtime exception forwarding.

Parameters:

forwardExceptions - true runtime exceptions are thrown on thread boundaries controlled by SNMP4J and related APIs. Default is false.

Our code is like below.
AbstractTransportMapping<?> transport = new DefaultUdpTransportMapping(new UdpAddress(port));

ThreadPool threadPool = ThreadPool.create(“DispatcherPool”, 200);
MultiThreadedMessageDispatcher mtDispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());

Can you give some suggestion where to use this
" SNMP4JSettings.setForwardRuntimeExceptions(false); "

Thanks,

Ajit

Hi Frank,

Also can you please confirm if we will use this " SNMP4JSettings.forwardRuntimeExceptions to false " then all the exception will not log or some specific exception will thrown to java console.

OK, then everything is fine if you use the default MessageDispatcherImpl.
The MultiThreadedMessageDispatcher does not honour the SNMP4JSettings.forwardRuntimeException flag directly. But the underlying MessageDispatcherImpl does.

But I think, you are not talking about a forwarded exception but about the stack trace printed to stdout. This is indeed a small bug in the code (<=2.8.11 and <=3.7.1). Version 2.8.12 and 3.7.2 will print the stack trace only if debug logging is enabled for MessageDispatcherImpl.