[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