[SNMP4J] NullPointerException in processReport()

Christian Defoy christian.defoy at gmail.com
Fri Aug 1 18:13:20 CEST 2008


Hi,

I am receiving a NullPointerException using SNMPv3 at AuthPriv level.
It is worth mentioning that I am using localized users.  The error
occurs when I am deliberately using a wrong authentication password:

        snmp.getUSM().addLocalizedUser( engineID, new OctetString(
"admin" ), AuthMD5.ID, security.passwordToKey( AuthMD5.ID, new
OctetString( "wrong" ), engineID ), PrivDES.ID,
security.passwordToKey( PrivDES.ID, AuthMD5.ID, new OctetString(
"password" ), engineID ) );

I have located the source of the problem in the Snmp$ReportProcessor
class in the processReport() method.

// if legal report PDU received, then resend request
if( resend )
{
   logger.debug( "Send new request after report." );
   ...
}
else
{
   boolean intime;
   synchronized( request )
   {
      intime = request.cancel();  // This here sets request.listener = null
   }
   // remove pending request
   // (sync is not needed as request is already canceled)
   pendingRequests.remove( handle );
   if( intime )
   {
      // return report
      request.listener.onResponse( new ResponseEvent( this,
e.getPeerAddress(), request.pdu, pdu, request.userObject ) );
      // BOOM!

The call to request.cancel() sets the request.listener to null.
Later, if the response in intime, a call to
request.listener.onResponse is made.  That's where it hurts!  The
worker thread never returns and the caller never gets notified that a
problem occured.  Am I understanding this correctly?  Is it possible
that I am doing something wrong?

Just for fun, I tried the following fix and it seems to work but my
knowledge of SNMPv3 security is not really good so I may be breaking
something.

Possible fix: retrieve a reference to the listener in the synchronized
block prior to invoking the cancel() method.  Since the reportHandler
is pluggable in the Snmp class, it might be a good idea to wrap its
invocation with a try-catch block :)



More information about the SNMP4J mailing list