[libvirt] [PATCH] virFirewallAddRule: fix build with clang

Ján Tomko jtomko at redhat.com
Fri Dec 9 11:59:10 UTC 2016


clang complains:
util/virfirewall.c:425:20: error: passing an object that undergoes
default argument promotion to 'va_start' has undefined behavior
[-Werror,-Wvarargs]
    __builtin_va_start(args, layer);

Introduce a macro wrapper that puts a NULL pointer after the enum
argument.
---
Previous attempts exchanged the arguments:
https://www.redhat.com/archives/libvir-list/2016-June/msg02173.html

or changed the type to int:
https://www.redhat.com/archives/libvir-list/2016-December/msg00379.html

 src/libvirt_private.syms |  2 +-
 src/util/virfirewall.c   |  9 +++++----
 src/util/virfirewall.h   | 11 ++++++++---
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 867acdb..4c92dba 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1616,8 +1616,8 @@ virFindFileInPath;
 
 
 # util/virfirewall.h
-virFirewallAddRule;
 virFirewallAddRuleFull;
+virFirewallAddRuleInt;
 virFirewallApply;
 virFirewallFree;
 virFirewallNew;
diff --git a/src/util/virfirewall.c b/src/util/virfirewall.c
index 3f97618..c71a274 100644
--- a/src/util/virfirewall.c
+++ b/src/util/virfirewall.c
@@ -416,13 +416,14 @@ virFirewallAddRuleFullV(virFirewallPtr firewall,
  * Returns the new rule
  */
 virFirewallRulePtr
-virFirewallAddRule(virFirewallPtr firewall,
-                   virFirewallLayer layer,
-                   ...)
+virFirewallAddRuleInt(virFirewallPtr firewall,
+                      virFirewallLayer layer,
+                      void *null,
+                      ...)
 {
     virFirewallRulePtr rule;
     va_list args;
-    va_start(args, layer);
+    va_start(args, null);
     rule = virFirewallAddRuleFullV(firewall, layer, false, NULL, NULL, args);
     va_end(args);
     return rule;
diff --git a/src/util/virfirewall.h b/src/util/virfirewall.h
index dbf3975..f28a421 100644
--- a/src/util/virfirewall.h
+++ b/src/util/virfirewall.h
@@ -44,11 +44,16 @@ virFirewallPtr virFirewallNew(void);
 
 void virFirewallFree(virFirewallPtr firewall);
 
-virFirewallRulePtr virFirewallAddRule(virFirewallPtr firewall,
-                                      virFirewallLayer layer,
-                                      ...)
+virFirewallRulePtr virFirewallAddRuleInt(virFirewallPtr firewall,
+                                         virFirewallLayer layer,
+                                         void *null,
+                                         ...)
     ATTRIBUTE_SENTINEL;
 
+/* work around passing an enum to va_start */
+# define virFirewallAddRule(firewall, layer, ...) \
+         virFirewallAddRuleInt(firewall, layer, NULL, __VA_ARGS__)
+
 typedef int (*virFirewallQueryCallback)(virFirewallPtr firewall,
                                         const char *const *lines,
                                         void *opaque);
-- 
2.7.3




More information about the libvir-list mailing list