From e318a693cca0f8f73e50d13e2bd0e34502e0141c Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 13 Dec 2009 20:52:41 +0000 Subject: [PATCH] [packages] olsrd: fix multiple memleaks in tc and mid handling and the httpinfo plugin - thanks russell git-svn-id: svn://svn.openwrt.org/openwrt/packages/net/olsrd@18774 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- Makefile | 2 +- patches/200-mid_memory_cleanup.patch | 256 +++++++++++++++++++++++++++ 2 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 patches/200-mid_memory_cleanup.patch diff --git a/Makefile b/Makefile index 36f395d..71f78b4 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=olsrd PKG_VERSION:=0.5.6-r7 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=http://www.olsr.org/releases/0.5 diff --git a/patches/200-mid_memory_cleanup.patch b/patches/200-mid_memory_cleanup.patch new file mode 100644 index 0000000..513fc68 --- /dev/null +++ b/patches/200-mid_memory_cleanup.patch @@ -0,0 +1,256 @@ +--- a/lib/httpinfo/src/olsrd_httpinfo.c ++++ b/lib/httpinfo/src/olsrd_httpinfo.c +@@ -673,9 +673,16 @@ + void + olsr_plugin_exit(void) + { ++ struct allowed_net *a, *next; + if (http_socket >= 0) { + CLOSE(http_socket); + } ++ ++ for (a = allowed_nets; a != NULL; a = next) { ++ next = a->next; ++ ++ free(a); ++ } + } + + static void +--- a/src/interfaces.h ++++ b/src/interfaces.h +@@ -187,6 +187,7 @@ + extern struct interface *ifnet; + + int ifinit(void); ++void olsr_delete_interfaces(void); + + void run_ifchg_cbs(struct interface *, int); + +--- a/src/linux/kernel_routes.c ++++ b/src/linux/kernel_routes.c +@@ -84,6 +84,8 @@ + OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock); + } + else { ++ memset(&addr, 0, sizeof(addr)); ++ + addr.nl_family = AF_NETLINK; + addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes) + addr.nl_groups = rtnl_mgrp; +--- a/src/main.c ++++ b/src/main.c +@@ -57,6 +57,7 @@ + #include "net_os.h" + #include "build_msg.h" + #include "net_olsr.h" ++#include "mid_set.h" + + #if LINUX_POLICY_ROUTING + #include +@@ -514,6 +515,7 @@ + #endif + { + struct interface *ifn; ++ int exit_value; + + OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo); + +@@ -530,6 +532,12 @@ + + olsr_delete_all_kernel_routes(); + ++ olsr_delete_all_tc_entries(); ++ ++ olsr_delete_all_mid_entries(); ++ ++ olsr_destroy_parser(); ++ + OLSR_PRINTF(1, "Closing sockets...\n"); + + /* front-end IPC socket */ +@@ -537,7 +545,6 @@ + shutdown_ipc(); + } + +- /* OLSR sockets */ + for (ifn = ifnet; ifn; ifn = ifn->int_next) + close(ifn->olsr_socket); + +@@ -565,13 +572,17 @@ + #endif + + /* Free cookies and memory pools attached. */ ++ OLSR_PRINTF(0, "Free all memory...\n"); + olsr_delete_all_cookies(); + + olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version); + + OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n http://www.olsr.org\n", olsrd_version); + +- exit(olsr_cnf->exit_value); ++ exit_value = olsr_cnf->exit_value; ++ free (olsr_cnf); ++ ++ exit(exit_value); + } + + /** +--- a/src/mid_set.c ++++ b/src/mid_set.c +@@ -38,6 +38,7 @@ + * the copyright holders. + * + */ ++#include + + #include "ipcalc.h" + #include "defs.h" +@@ -79,6 +80,15 @@ + return 1; + } + ++void olsr_delete_all_mid_entries(void) { ++ int hash; ++ ++ for (hash = 0; hash < HASHSIZE; hash++) { ++ while (mid_set[hash].next != &mid_set[hash]) { ++ olsr_delete_mid_entry(mid_set[hash].next); ++ } ++ } ++} + /** + * Wrapper for the timer callback. + */ +@@ -124,10 +134,10 @@ + * + * @param m_addr the main address of the node + * @param alias the alias address to insert +- * @return nada ++ * @return false if mid_address is unnecessary, true otherwise + */ + +-void ++static bool + insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime) + { + struct mid_entry *tmp; +@@ -147,9 +157,8 @@ + /* Check if alias is already registered with m_addr */ + registered_m_addr = mid_lookup_main_addr(&alias->alias); + if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) { +- + /* Alias is already registered with main address. Nothing to do here. */ +- return; ++ return false; + } + + /* +@@ -223,6 +232,7 @@ + } + tmp_adr = tmp_adr->next_alias; + } ++ return true; + } + + /** +@@ -284,7 +294,9 @@ + } + } + +- insert_mid_tuple(main_add, adr, vtime); ++ if (!insert_mid_tuple(main_add, adr, vtime)) { ++ free(adr); ++ } + + /* + *Recalculate topology +--- a/src/mid_set.h ++++ b/src/mid_set.h +@@ -75,7 +75,7 @@ + struct mid_alias; + + int olsr_init_mid_set(void); +-void insert_mid_tuple(union olsr_ip_addr *, struct mid_address *, olsr_reltime); ++void olsr_delete_all_mid_entries(void); + void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime); + union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *); + struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *); +--- a/src/parser.c ++++ b/src/parser.c +@@ -102,6 +102,26 @@ + } + + void ++olsr_destroy_parser(void) { ++ struct parse_function_entry *pe, *pe_next; ++ struct preprocessor_function_entry *ppe, *ppe_next; ++ struct packetparser_function_entry *pae, *pae_next; ++ ++ for (pe = parse_functions; pe; pe = pe_next) { ++ pe_next = pe->next; ++ free (pe); ++ } ++ for (ppe = preprocessor_functions; ppe; ppe = ppe_next) { ++ ppe_next = ppe->next; ++ free (ppe); ++ } ++ for (pae = packetparser_functions; pae; pae = pae_next) { ++ pae_next = pae->next; ++ free(pae); ++ } ++} ++ ++void + olsr_parser_add_function(parse_function * function, uint32_t type) + { + struct parse_function_entry *new_entry; +--- a/src/parser.h ++++ b/src/parser.h +@@ -74,6 +74,8 @@ + + void olsr_init_parser(void); + ++void olsr_destroy_parser(void); ++ + void olsr_input(int); + + void olsr_input_hostemu(int); +--- a/src/scheduler.c ++++ b/src/scheduler.c +@@ -40,6 +40,8 @@ + * + */ + ++#include ++ + #include "defs.h" + #include "scheduler.h" + #include "log.h" +--- a/src/tc_set.c ++++ b/src/tc_set.c +@@ -205,6 +205,14 @@ + tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr); + } + ++void olsr_delete_all_tc_entries(void) { ++ struct tc_entry *tc; ++ ++ OLSR_FOR_ALL_TC_ENTRIES(tc) { ++ olsr_delete_tc_entry(tc); ++ } OLSR_FOR_ALL_TC_ENTRIES_END(tc) ++} ++ + /** + * The main ip address has changed. + * Do the needful. +--- a/src/tc_set.h ++++ b/src/tc_set.h +@@ -142,6 +142,7 @@ + extern struct tc_entry *tc_myself; + + void olsr_init_tc(void); ++void olsr_delete_all_tc_entries(void); + void olsr_change_myself_tc(void); + void olsr_print_tc_table(void); + void olsr_time_out_tc_set(void); -- 2.30.2