]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
network: pf: fix memory leaks
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Fri, 24 Jul 2026 17:34:58 +0000 (19:34 +0200)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Sat, 25 Jul 2026 04:50:25 +0000 (06:50 +0200)
Properly free result of virSocketAddrFormat() and
virBufferContentAndReset().

Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/network/network_pf.c

index 724b82c05406cea72c5caa40e547e657a456492c..95f63ac37f6ea0dc40d8cb3675cf69ec59d08f00 100644 (file)
@@ -171,6 +171,8 @@ pfAddNatFirewallRules(virNetworkDef *def,
     g_autoptr(virCommand) flush_cmd = virCommandNew(PFCTL);
     virPortRange *portRange = &def->forward.port;
     g_autofree char *portRangeStr = NULL;
+    g_autofree char *addr = NULL;
+    g_autofree char *pf_rules = NULL;
 
     if (prefix < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -205,36 +207,39 @@ pfAddNatFirewallRules(virNetworkDef *def,
         }
     }
 
+    if (!(addr = virSocketAddrFormat(&ipdef->address)))
+        return -1;
+
     virBufferAsprintf(&pf_rules_buf,
                       "table <natdst> persist { 0.0.0.0/0, ! %s/%d, ! %s, ! %s }\n",
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix,
                       networkLocalMulticastIPv4,
                       networkLocalBroadcast);
     virBufferAsprintf(&pf_rules_buf,
                       "nat pass on %s from %s/%d to <natdst> -> (%s) port %s\n",
                       forwardIf,
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix,
                       forwardIf,
                       portRangeStr);
     virBufferAsprintf(&pf_rules_buf,
                       "pass quick on %s from %s/%d to %s/%d\n",
                       def->bridge,
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix,
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix);
     virBufferAsprintf(&pf_rules_buf,
                       "pass quick on %s from %s/%d to %s\n",
                       def->bridge,
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix,
                       networkLocalMulticastIPv4);
     virBufferAsprintf(&pf_rules_buf,
                       "pass quick on %s from %s/%d to %s\n",
                       def->bridge,
-                      virSocketAddrFormat(&ipdef->address),
+                      addr,
                       prefix,
                       networkLocalBroadcast);
     virBufferAsprintf(&pf_rules_buf,
@@ -246,7 +251,8 @@ pfAddNatFirewallRules(virNetworkDef *def,
     virCommandAddArgFormat(cmd, "libvirt/%s", def->name);
     virCommandAddArgList(cmd, "-f", "-", NULL);
 
-    virCommandSetInputBuffer(cmd, virBufferContentAndReset(&pf_rules_buf));
+    pf_rules = virBufferContentAndReset(&pf_rules_buf);
+    virCommandSetInputBuffer(cmd, pf_rules);
 
     /* pfctl -a libvirt/default -F all */
     /* Flush rules as a separate command, so when it fails, e.g. because the