From 4b45b24d9d1c1d62a90d13aed763fe699bdb5b14 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Sat, 28 Jun 2008 09:23:02 -0700 Subject: [PATCH] inetmib1: Free memory when DLL is unloaded. --- dlls/inetmib1/main.c | 96 +++++++++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 28 deletions(-) diff --git a/dlls/inetmib1/main.c b/dlls/inetmib1/main.c index f14b78c68c..09b408c252 100644 --- a/dlls/inetmib1/main.c +++ b/dlls/inetmib1/main.c @@ -29,24 +29,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(inetmib1); -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); - - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break; - case DLL_PROCESS_DETACH: - break; - default: - break; - } - - return TRUE; -} - /** * Utility functions */ @@ -113,6 +95,7 @@ struct mibImplementation AsnObjectIdentifier name; void (*init)(void); varqueryfunc query; + void (*cleanup)(void); }; static UINT mib2IfNumber[] = { 1,3,6,1,2,1,2,1 }; @@ -130,6 +113,11 @@ static void mib2IfNumberInit(void) } } +static void mib2IfNumberCleanup(void) +{ + HeapFree(GetProcessHeap(), 0, ifTable); +} + static BOOL mib2IfNumberQuery(BYTE bPduType, SnmpVarBind *pVarBind, AsnInteger32 *pErrorStatus) { @@ -651,6 +639,11 @@ static void mib2IpAddrInit(void) } } +static void mib2IpAddrCleanup(void) +{ + HeapFree(GetProcessHeap(), 0, ipAddrTable); +} + static void oidToIpAddrRow(AsnObjectIdentifier *oid, void *dst) { MIB_IPADDRROW *row = dst; @@ -734,6 +727,11 @@ static void mib2IpRouteInit(void) } } +static void mib2IpRouteCleanup(void) +{ + HeapFree(GetProcessHeap(), 0, ipRouteTable); +} + static void oidToIpForwardRow(AsnObjectIdentifier *oid, void *dst) { MIB_IPFORWARDROW *row = dst; @@ -809,6 +807,11 @@ static void mib2IpNetInit(void) } } +static void mib2IpNetCleanup(void) +{ + HeapFree(GetProcessHeap(), 0, ipNetTable); +} + static BOOL mib2IpNetQuery(BYTE bPduType, SnmpVarBind *pVarBind, AsnInteger32 *pErrorStatus) { @@ -1050,6 +1053,11 @@ static void mib2UdpEntryInit(void) } } +static void mib2UdpEntryCleanup(void) +{ + HeapFree(GetProcessHeap(), 0, udpTable); +} + static struct structToAsnValue mib2UdpEntryMap[] = { { FIELD_OFFSET(MIB_UDPROW, dwLocalAddr), copyIpAddr }, { FIELD_OFFSET(MIB_UDPROW, dwLocalPort), copyInt }, @@ -1129,16 +1137,20 @@ static BOOL mib2UdpEntryQuery(BYTE bPduType, SnmpVarBind *pVarBind, /* This list MUST BE lexicographically sorted */ static struct mibImplementation supportedIDs[] = { - { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery }, - { DEFINE_OID(mib2IfEntry), NULL, mib2IfEntryQuery }, - { DEFINE_OID(mib2Ip), mib2IpStatsInit, mib2IpStatsQuery }, - { DEFINE_OID(mib2IpAddr), mib2IpAddrInit, mib2IpAddrQuery }, - { DEFINE_OID(mib2IpRoute), mib2IpRouteInit, mib2IpRouteQuery }, - { DEFINE_OID(mib2IpNet), mib2IpNetInit, mib2IpNetQuery }, - { DEFINE_OID(mib2Icmp), mib2IcmpInit, mib2IcmpQuery }, - { DEFINE_OID(mib2Tcp), mib2TcpInit, mib2TcpQuery }, - { DEFINE_OID(mib2Udp), mib2UdpInit, mib2UdpQuery }, - { DEFINE_OID(mib2UdpEntry), mib2UdpEntryInit, mib2UdpEntryQuery }, + { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery, + mib2IfNumberCleanup }, + { DEFINE_OID(mib2IfEntry), NULL, mib2IfEntryQuery, NULL }, + { DEFINE_OID(mib2Ip), mib2IpStatsInit, mib2IpStatsQuery, NULL }, + { DEFINE_OID(mib2IpAddr), mib2IpAddrInit, mib2IpAddrQuery, + mib2IpAddrCleanup }, + { DEFINE_OID(mib2IpRoute), mib2IpRouteInit, mib2IpRouteQuery, + mib2IpRouteCleanup }, + { DEFINE_OID(mib2IpNet), mib2IpNetInit, mib2IpNetQuery, mib2IpNetCleanup }, + { DEFINE_OID(mib2Icmp), mib2IcmpInit, mib2IcmpQuery, NULL }, + { DEFINE_OID(mib2Tcp), mib2TcpInit, mib2TcpQuery, NULL }, + { DEFINE_OID(mib2Udp), mib2UdpInit, mib2UdpQuery, NULL }, + { DEFINE_OID(mib2UdpEntry), mib2UdpEntryInit, mib2UdpEntryQuery, + mib2UdpEntryCleanup }, }; static UINT minSupportedIDLength; @@ -1164,6 +1176,15 @@ BOOL WINAPI SnmpExtensionInit(DWORD dwUptimeReference, return TRUE; } +static void cleanup(void) +{ + UINT i; + + for (i = 0; i < sizeof(supportedIDs) / sizeof(supportedIDs[0]); i++) + if (supportedIDs[i].cleanup) + supportedIDs[i].cleanup(); +} + static struct mibImplementation *findSupportedQuery(UINT *ids, UINT idLength, UINT *matchingIndex) { @@ -1260,3 +1281,22 @@ BOOL WINAPI SnmpExtensionQuery(BYTE bPduType, SnmpVarBindList *pVarBindList, *pErrorIndex = errorIndex; return TRUE; } + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); + + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + cleanup(); + break; + default: + break; + } + + return TRUE; +} -- 2.32.0.93.g670b81a890