[Ace-users] [ace-users] [ace-bugs] [asnmp]: [agent PDU receiving bug]

Johnny Willemsen jwillemsen at remedy.nl
Fri Feb 1 02:39:04 CST 2008


hi,

Thanks for using the PRF form. Wouldn't your change result in a possible
memory leak?

Regards,


Johnny Willemsen
Remedy IT
Postbus 101
2650 AC  Berkel en Rodenrijs
The Netherlands
www.theaceorb.nl / www.remedy.nl  

*** Integrated compile and test statistics see
http://scoreboard.theaceorb.nl ***
*** Commercial service and support for ACE/TAO/CIAO             ***
*** See http://www.theaceorb.nl/en/support.html                 ***



"Artem Nikitin" <nikitin at komset.ru> wrote in message
news:<mailman.3511.1201843967.5286.ace-bugs at mail.cse.wustl.edu>...
> ACE VERSION: 5.5, released Sun Mar 05 11:10:32 2006.
> 
> HOST MACHINE and OPERATING SYSTEM:
>      MS Windows 2000, WINSOCK 2.0 (Product version 5.00.2195.6601 and
>      5.2.3790.3959)
>      
> TARGET MACHINE and OPERATING SYSTEM, if different from HOST: -
> COMPILER NAME AND VERSION (AND PATCHLEVEL):
>    C++ compiler MS Visual Studio.NET 2003 (with SP1)
> 
> AREA/CLASS/EXAMPLE AFFECTED: asnmp library, sagent class
> 
> DOES THE PROBLEM AFFECT:EXECUTION
> 
> SYNOPSIS: PDU receiving bug
> 
> DESCRIPTION:
> I work with asnmp
> library and "sagent" class for creating my simple SNMP agent.
> 
> I got non-null('\0') terminated string when receive PDU from manager in
the
> "get_community" method of "wpdu" class. My call stack was damaging.
> 
> REPEAT BY:
> ....
>  char rcv_com_str[MAX_COMM_STR_LEN];
>  transaction tr(_snmp_session_);
>  tr.handle_input(fd);
>  if (tr.result(pdu_, rcv_com_str) < 0)  // damaging call
>     return 0;
> ....
> 
> 
> // return pdu to caller
> int transaction::result(Pdu& pdu, char *comm_str, ACE_INET_Addr *from)
> {
>   // TODO: check to see the sender matches the receiver address..
> 
>   // remove any vbs existing in this pdu
>   pdu.delete_all_vbs();
> 
>  // any data to return?
>  if (receive_iovec_.iov_len == 0)
>    return -1;
> 
>  wpdu tmp(receive_iovec_);
> 
>  snmp_version ver;
> 
>  // return comm str and from address of incomming pdu if requested
>  int rc = tmp.get_pdu(pdu, ver);
>  if (comm_str) 
>    strcpy(comm_str, (char *)tmp.get_community());
>  if (from)
>   *from = receive_addr_;
>  return rc;
> }
> 
> SAMPLE FIX/WORKAROUND:
> 
> wpdu.cpp file:
> 
> void wpdu::get_community(char* target) const
> {
>   strncpy(target, community_name, comm_len);
> }
> 



More information about the Ace-users mailing list