contrib/package: fix memory leaks in olsrd 0.5.6-r7 stable
[project/luci.git] / contrib / package / olsrd-luci / patches / 200-mid_memory_cleanup.patch
1 --- a/lib/httpinfo/src/olsrd_httpinfo.c
2 +++ b/lib/httpinfo/src/olsrd_httpinfo.c
3 @@ -687,9 +687,16 @@
4  void
5  olsr_plugin_exit(void)
6  {
7 +  struct allowed_net *a, *next;
8    if (http_socket >= 0) {
9      CLOSE(http_socket);
10    }
11 +
12 +  for (a = allowed_nets; a != NULL; a = next) {
13 +    next = a->next;
14 +
15 +    free(a);
16 +  }
17  }
18  
19  static void
20 --- a/src/interfaces.h
21 +++ b/src/interfaces.h
22 @@ -187,6 +187,7 @@
23  extern struct interface *ifnet;
24  
25  int ifinit(void);
26 +void olsr_delete_interfaces(void);
27  
28  void run_ifchg_cbs(struct interface *, int);
29  
30 --- a/src/linux/kernel_routes.c
31 +++ b/src/linux/kernel_routes.c
32 @@ -85,6 +85,8 @@
33      OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock);
34    }
35    else {
36 +    memset(&addr, 0, sizeof(addr));
37 +
38      addr.nl_family = AF_NETLINK;
39      addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
40      addr.nl_groups = rtnl_mgrp;
41 --- a/src/main.c
42 +++ b/src/main.c
43 @@ -57,6 +57,7 @@
44  #include "net_os.h"
45  #include "build_msg.h"
46  #include "net_olsr.h"
47 +#include "mid_set.h"
48  
49  #if LINUX_POLICY_ROUTING
50  #include <linux/types.h>
51 @@ -526,6 +527,7 @@
52  #endif
53  {
54    struct interface *ifn;
55 +  int exit_value;
56  
57    OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo);
58  
59 @@ -542,6 +544,12 @@
60  
61    olsr_delete_all_kernel_routes();
62  
63 +  olsr_delete_all_tc_entries();
64 +
65 +  olsr_delete_all_mid_entries();
66 +
67 +  olsr_destroy_parser();
68 +
69    OLSR_PRINTF(1, "Closing sockets...\n");
70  
71    /* front-end IPC socket */
72 @@ -551,7 +559,6 @@
73    }
74  #endif /* SVEN_OLA_UNBLOAT */
75  
76 -  /* OLSR sockets */
77    for (ifn = ifnet; ifn; ifn = ifn->int_next)
78      close(ifn->olsr_socket);
79  
80 @@ -581,13 +588,17 @@
81  #endif
82  
83    /* Free cookies and memory pools attached. */
84 +  OLSR_PRINTF(0, "Free all memory...\n");
85    olsr_delete_all_cookies();
86  
87    olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
88  
89    OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", olsrd_version);
90  
91 -  exit(olsr_cnf->exit_value);
92 +  exit_value = olsr_cnf->exit_value;
93 +  free (olsr_cnf);
94 +
95 +  exit(exit_value);
96  }
97  
98  /**
99 --- a/src/mid_set.c
100 +++ b/src/mid_set.c
101 @@ -38,6 +38,7 @@
102   * the copyright holders.
103   *
104   */
105 +#include <assert.h>
106  
107  #include "ipcalc.h"
108  #include "defs.h"
109 @@ -79,6 +80,15 @@
110    return 1;
111  }
112  
113 +void olsr_delete_all_mid_entries(void) {
114 +  int hash;
115 +
116 +  for (hash = 0; hash < HASHSIZE; hash++) {
117 +    while (mid_set[hash].next != &mid_set[hash]) {
118 +      olsr_delete_mid_entry(mid_set[hash].next);
119 +    }
120 +  }
121 +}
122  /**
123   * Wrapper for the timer callback.
124   */
125 @@ -124,10 +134,10 @@
126   *
127   * @param m_addr the main address of the node
128   * @param alias the alias address to insert
129 - * @return nada
130 + * @return false if mid_address is unnecessary, true otherwise
131   */
132  
133 -void
134 +static bool
135  insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime)
136  {
137    struct mid_entry *tmp;
138 @@ -147,9 +157,8 @@
139    /* Check if alias is already registered with m_addr */
140    registered_m_addr = mid_lookup_main_addr(&alias->alias);
141    if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) {
142 -
143      /* Alias is already registered with main address. Nothing to do here. */
144 -    return;
145 +    return false;
146    }
147  
148    /*
149 @@ -223,6 +232,7 @@
150      }
151      tmp_adr = tmp_adr->next_alias;
152    }
153 +  return true;
154  }
155  
156  /**
157 @@ -284,7 +294,9 @@
158      }
159    }
160  
161 -  insert_mid_tuple(main_add, adr, vtime);
162 +  if (!insert_mid_tuple(main_add, adr, vtime)) {
163 +    free(adr);
164 +  }
165  
166    /*
167     *Recalculate topology
168 --- a/src/mid_set.h
169 +++ b/src/mid_set.h
170 @@ -75,7 +75,7 @@
171  struct mid_alias;
172  
173  int olsr_init_mid_set(void);
174 -void insert_mid_tuple(union olsr_ip_addr *, struct mid_address *, olsr_reltime);
175 +void olsr_delete_all_mid_entries(void);
176  void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime);
177  union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *);
178  struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *);
179 --- a/src/parser.c
180 +++ b/src/parser.c
181 @@ -104,6 +104,26 @@
182  }
183  
184  void
185 +olsr_destroy_parser(void) {
186 +  struct parse_function_entry *pe, *pe_next;
187 +  struct preprocessor_function_entry *ppe, *ppe_next;
188 +  struct packetparser_function_entry *pae, *pae_next;
189 +
190 +  for (pe = parse_functions; pe; pe = pe_next) {
191 +    pe_next = pe->next;
192 +    free (pe);
193 +  }
194 +  for (ppe = preprocessor_functions; ppe; ppe = ppe_next) {
195 +    ppe_next = ppe->next;
196 +    free (ppe);
197 +  }
198 +  for (pae = packetparser_functions; pae; pae = pae_next) {
199 +    pae_next = pae->next;
200 +    free(pae);
201 +  }
202 +}
203 +
204 +void
205  olsr_parser_add_function(parse_function * function, uint32_t type)
206  {
207    struct parse_function_entry *new_entry;
208 --- a/src/parser.h
209 +++ b/src/parser.h
210 @@ -74,6 +74,8 @@
211  
212  void olsr_init_parser(void);
213  
214 +void olsr_destroy_parser(void);
215 +
216  void olsr_input(int);
217  
218  void olsr_input_hostemu(int);
219 --- a/src/scheduler.c
220 +++ b/src/scheduler.c
221 @@ -40,6 +40,8 @@
222   *
223   */
224  
225 +#include <assert.h>
226 +
227  #include "defs.h"
228  #include "scheduler.h"
229  #include "log.h"
230 --- a/src/tc_set.c
231 +++ b/src/tc_set.c
232 @@ -205,6 +205,14 @@
233    tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr);
234  }
235  
236 +void olsr_delete_all_tc_entries(void) {
237 +  struct tc_entry *tc;
238 +
239 +  OLSR_FOR_ALL_TC_ENTRIES(tc) {
240 +    olsr_delete_tc_entry(tc);
241 +  } OLSR_FOR_ALL_TC_ENTRIES_END(tc)
242 +}
243 +
244  /**
245   * The main ip address has changed.
246   * Do the needful.
247 --- a/src/tc_set.h
248 +++ b/src/tc_set.h
249 @@ -142,6 +142,7 @@
250  extern struct tc_entry *tc_myself;
251  
252  void olsr_init_tc(void);
253 +void olsr_delete_all_tc_entries(void);
254  void olsr_change_myself_tc(void);
255  void olsr_print_tc_table(void);
256  void olsr_time_out_tc_set(void);