Can you try the V5-7-patches branch and see what you experience?  I think
this is fixed by:

commit 56c30b11f3616ea4f0c38a21e08e78f050096020

Author: Bill Fenner <fen...@gmail.com>

Date:   Wed Dec 20 21:52:10 2017 +0000


    NEWS: snmplib: PATCH: 1349: Fix perl/other crash against bad SNMPv3
agent



    With the patch in 1214, the snmp_api code assumed that if magic was

    set, it was the "struct synch-state" from snmp_client.  Of course,

    magic belongs to the caller, and the perl library uses it differently,

    so reaching into it is verboten.  Introduce a new callback (that

    was already introduced in 5.8) to report this "retries exceeded"

    state, and use it in snmp_client.

Thanks,
  Bill

On Sat, Jan 13, 2018 at 1:36 AM, Hao Chen <earthlovepyt...@outlook.com>
wrote:

> Hi All:
>
>
>
> 1.
>
> My program need to use "callback" function and pass something back.
>
> So, I use "callback_magic" to store an C++ object address.
>
> So, I can get my C++ object and use it my callback function.
>
>
>
> My code looks like:
>
> ================================
>
> bool CERSnmpSession::open()
>
> {
>
> .....
>
>    m_sessionData.callback = callBack;
>
>    m_sessionData.callback_magic = this;
>
> .....
>
> }
>
>
>
> int SNMPSession::callBack(
>
>     int operation,
>
>     struct snmp_session *ses,
>
>     int reqid,
>
>     struct snmp_pdu *pdu,
>
>     void* magic)
>
> {
>
>     SNMPSession* ss = static_cast<SNMPSession*>(magic);
>
> .....
>
> }
>
>
>
>
>
> 2.
>
> The above code works well with net-snmp 5.4.4.
>
> But it coredump with net-snmp 5.7.3 while I set correct username & wrong
> password to do negative test.
>
>
>
> (1).
>
> The reason is that "_sess_process_packet()" (in snmp_api.c in 5.7.3) does:
>
>       if (callback == NULL
>
>                  || callback(NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE, sp,
>
>                                     pdu->reqid, pdu, magic) == 1) {
>
>                if (pdu->command == SNMP_MSG_REPORT) {
>
>                  if (sp->s_snmp_errno == SNMPERR_NOT_IN_TIME_WINDOW ||
>
>                      snmpv3_get_report_type(pdu) ==
>
>                      SNMPERR_NOT_IN_TIME_WINDOW) {
>
>                    /*
>
>                     * trigger immediate retry on recoverable Reports
>
>                     * * (notInTimeWindow), incr_retries == TRUE to prevent
>
>                     * * inifinite resend
>
>                     */
>
>                    if (rp->retries <= sp->retries) {
>
>                      snmp_resend_request(slp, rp, TRUE);
>
>                      break;
>
>                    } else {
>
>                      /* We're done with retries, so no longer waiting for
> a response */
>
>                      if (magic) {
>
>                               ((struct synch_state*)magic)->waiting = 0;
>
>                      }
>
>                    }
>
>                  } else {
>
>                    if (SNMPV3_IGNORE_UNAUTH_REPORTS) {
>
>                      break;
>
>                    } else { /* Set the state to no longer be waiting,
> since we're done with retries */
>
>                      if (magic) {
>
>                               ((struct synch_state*)magic)->waiting = 0;  
> ====>
> culprit
>
>                      }
>
>
>
>
>
> (2).
>
> I compared the same code in 5.4.4, it is:
>
>       if (callback == NULL
>
>                  || callback(NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE, sp,
>
>                                     pdu->reqid, pdu, magic) == 1) {
>
>                if (pdu->command == SNMP_MSG_REPORT) {
>
>                  if (sp->s_snmp_errno == SNMPERR_NOT_IN_TIME_WINDOW ||
>
>                      snmpv3_get_report_type(pdu) ==
>
>                      SNMPERR_NOT_IN_TIME_WINDOW) {
>
>                    /*
>
>                     * trigger immediate retry on recoverable Reports
>
>                     * * (notInTimeWindow), incr_retries == TRUE to prevent
>
>                     * * inifinite resend
>
>                     */
>
>                    if (rp->retries <= sp->retries) {
>
>                      snmp_resend_request(slp, rp, TRUE);
>
>                      break;
>
>                    }
>
>                  } else {
>
>                    if (SNMPV3_IGNORE_UNAUTH_REPORTS) {
>
>                      break;
>
>                    }
>
>                  }
>
>
>
>
>
> (3).
>
> We can see 5.7.3 has extra "((struct synch_state*)magic)->waiting = 0;"
> than 5.4.4
>
>
>
> 3.
>
> Can you please help me:
>
> 1). If I want to pass private stuff, shall I use "callback_magic" or
> "myvoid in struct snmp_session" to contain it?
>
>     I tested by using "myvoid" instead of "callback_magic" to contain my
> private call back data. It works fine.
>
>
>
> 2). Since "callback_magic" was changed since net-snmp 5.6.x, will net-snmp
> change "myvoid" in future release?
>
>
>
>
>
>
>
> Thanks and regards
>
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Net-snmp-users mailing list
> Net-snmp-users@lists.sourceforge.net
> Please see the following page to unsubscribe or change other options:
> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
>
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Net-snmp-users mailing list
Net-snmp-users@lists.sourceforge.net
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users

Reply via email to