On Tue, Sep 13, 2005 at 09:34:03AM +0100, Dave Shield wrote:
>
> I'd suggest that, as a basic rule of thumb, objects should
> be owned by the code module that created them.
>
> If memory is allocated by a library routine as part of creating
> or processing something, then that section of the library should
> be responsible for releasing it again (either automatically as
> part of tidying up, or via a suitable free API call).
>
> If memory is allocated and passed in from "outside", then
> "outside" should be responsible for releasing it again.
>
> There may well be exceptions to this basic model (in either
> direction), but they should be clearly documented as such.
> Keeping allocation and release together seems the most natural
> and balanced structure, IMO.
I fully agree with this.
Then I would like to know if the following is one of the exceptions.
Assúme the following subagent foo.c, I expect the remarks to be true:
1 #include <net-snmp/net-snmp-config.h>
2 #include <net-snmp/net-snmp-includes.h>
3 #include <net-snmp/agent/net-snmp-agent-includes.h>
4
5 void
6 init_foo(void)
7 {
8 oid tree[] = { 1, 3, 6, 1, 3, 1 };
9 netsnmp_handler_registration* reg =
10 netsnmp_create_handler_registration("Test", NULL,
11 tree, OID_LENGTH(tree),
12 HANDLER_CAN_RWRITE);
Here I have created the registration.
13 netsnmp_register_handler(reg);
Here I have registered the handler.
14 netsnmp_unregister_handler(reg);
Here I have unregistered the handler but it is still valid so I coud
reregister it.
15 netsnmp_handler_registration_free(reg);
Here I have destroyed the registration.
16 }
Sadly this is not the case in the current code.
netsnmp_unregister_handler calls unregister_mib_context with arguments
taken from reg.
This is quite OK.
unregister_mib_context in turn calls netsnmp_subtree_free on the
netsnmp_subtree structure that corresponds to the registration.
This is also OK.
netsnmp_subtree_free in turn calls netsnmp_handler_registration_free on a
reference reg that is embedded in netsnmp_subtree struct.
This is not OK from the above point of view, unless this is one of the other
cases.
Then unregister_mib_context goes on to use it's arguments, that came from reg,
and dereference them to send into snmp_call_callbacks.
This is an dereference of freed memory if the previous case was OK.
I think that the right thing to do is to remove the call to
netsnmp_handler_registration_free from netsnmp_subtree_free but unfortunateley
this introduces at least one memory leak, possibly more.
/MF
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server.
Download it for free - -and be entered to win a 42" plasma tv or your very
own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders