[ovs-dev] [PATCH ovn] pinctrl: Fix various leaks of lport addresses.

Ilya Maximets i.maximets at ovn.org
Wed May 13 16:50:05 UTC 2020


Example of one of the valgrind reports:

 4,012 bytes in 59 blocks are definitely lost in loss record 1,579 of 1,631
    at 0x4839748: malloc (vg_replace_malloc.c:308)
    by 0x483BD63: realloc (vg_replace_malloc.c:836)
    by 0x4C8F74: xrealloc (util.c:149)
    by 0x4397E4: add_ipv4_netaddr.isra.0 (ovn-util.c:34)
    by 0x439A65: parse_and_store_addresses (ovn-util.c:141)
    by 0x439CB8: extract_addresses (ovn-util.c:174)
    by 0x439CB8: extract_lsp_addresses (ovn-util.c:189)
    by 0x41A134: fill_ipv6_prefix_state (pinctrl.c:1092)
    by 0x41A134: prepare_ipv6_prefixd (pinctrl.c:1209)
    by 0x41FC57: pinctrl_run (pinctrl.c:2930)
    by 0x4096BB: main (ovn-controller.c:2101)

CC: Numan Siddique <numans at ovn.org>
CC: Lorenzo Bianconi <lorenzo.bianconi at redhat.com>
Fixes: 8be01f4a5329 ("Send service monitor health checks")
Fixes: e3a398e9146e ("controller: Add ipv6 prefix delegation state machine")
Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
---
 controller/pinctrl.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index d976ec82b..103198282 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -1130,6 +1130,7 @@ fill_ipv6_prefix_state(struct ovsdb_idl_txn *ovnsb_idl_txn,
             smap_destroy(&options);
         }
         pfd->last_used = time_msec();
+        destroy_lport_addresses(&c_addrs);
     }
 
     return changed;
@@ -1194,8 +1195,10 @@ prepare_ipv6_prefixd(struct ovsdb_idl_txn *ovnsb_idl_txn,
                 ea = laddrs.ea;
                 if (laddrs.n_ipv6_addrs > 0) {
                     ip6_addr = laddrs.ipv6_addrs[0].addr;
+                    destroy_lport_addresses(&laddrs);
                     break;
                 }
+                destroy_lport_addresses(&laddrs);
             }
 
             if (eth_addr_is_zero(ea)) {
@@ -5839,8 +5842,9 @@ sync_svc_monitors(struct ovsdb_idl_txn *ovnsb_idl_txn,
 
         struct eth_addr ea;
         bool mac_found = false;
-        for (size_t i = 0; i < pb->n_mac; i++) {
+        for (size_t i = 0; i < pb->n_mac && !mac_found; i++) {
             struct lport_addresses laddrs;
+
             if (!extract_lsp_addresses(pb->mac[i], &laddrs)) {
                 continue;
             }
@@ -5853,14 +5857,13 @@ sync_svc_monitors(struct ovsdb_idl_txn *ovnsb_idl_txn,
                 }
             }
 
-            if (mac_found) {
-                break;
-            } else if (!laddrs.n_ipv4_addrs) {
+            if (!mac_found && !laddrs.n_ipv4_addrs) {
                 /* IPv4 address(es) are not configured. Use the first mac. */
                 ea = laddrs.ea;
                 mac_found = true;
-                break;
             }
+
+            destroy_lport_addresses(&laddrs);
         }
 
         if (!mac_found) {
-- 
2.25.4



More information about the dev mailing list