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