
On 04/26/2016 09:42 AM, Andrea Bolognani wrote:
On Sat, 2016-04-23 at 15:39 -0400, Cole Robinson wrote:
And the 'ip' tool. There isn't much benefit to checking this at configure time when we have infrastructure nowadays for looking up binaries in the PATH --- v2: Keep the virFileIsExecutable check
configure.ac | 12 ------ src/util/virfirewall.c | 18 +++++---- src/util/virnetdev.c | 6 +-- tests/virfirewalltest.c | 98 ++++++++++++++++++++++++------------------------- 4 files changed, 62 insertions(+), 72 deletions(-)
[...]
@@ -182,17 +182,19 @@ virFirewallValidateBackend(virFirewallBackend backend)
if (backend == VIR_FIREWALL_BACKEND_DIRECT) { const char *commands[] = { - IPTABLES_PATH, IP6TABLES_PATH, EBTABLES_PATH + "iptables", "ip6tables", "ebtables" }; size_t i;
for (i = 0; i < ARRAY_CARDINALITY(commands); i++) { - if (!virFileIsExecutable(commands[i])) { + char *path = virFindFileInPath(commands[i]); + if (!path || !virFileIsExecutable(path)) { virReportSystemError(errno, _("direct firewall backend requested, but %s is not available"), commands[i]);
You need to VIR_FREE(path) here as well to avoid leaking memory.
Thanks, fixed locally
return -1; } + VIR_FREE(path); } VIR_DEBUG("found iptables/ip6tables/ebtables, using direct backend"); }
[...]
--- a/tests/virfirewalltest.c +++ b/tests/virfirewalltest.c @@ -128,11 +128,11 @@ VIR_MOCK_WRAP_RET_ARGS(dbus_connection_send_with_reply_and_block,
if (fwBuf) { if (STREQ(type, "ipv4")) - virBufferAddLit(fwBuf, IPTABLES_PATH); + virBufferAddLit(fwBuf, "iptables"); else if (STREQ(type, "ipv4"))
Unrelated to your changes, but shouldn't the above be "ipv6"?
Nice catch :) Indeed that seems wrong, but doesn't look like the test suite even hits that code path AFAICT, every bit of data it tests is for iptables only
- virBufferAddLit(fwBuf, IP6TABLES_PATH); + virBufferAddLit(fwBuf, "ip6tables"); else - virBufferAddLit(fwBuf, EBTABLES_PATH); + virBufferAddLit(fwBuf, "ebtables"); } for (i = 0; i < nargs; i++) { if (fwBuf) {
[...]
This series works fine on my Fedora builder, but breaks 'make check' on my Debian builder, because iptables is installed in /sbin and the user's $PATH doesn't contain that directory, which causes virFirewallValidateBackend() to fail.
I think the proper solution would be to mock filesystem access in the test suite so that *tables commands are always found. That way you'd be able to run the test suite even when *tables commands are not installed on the systems, which seems perfectly reasonable if you only ever intend to use the firewalld backend[1].
Hmm, okay. I'll put it on my todo list Thanks, Cole
[1] Of course firewalld itself seems to depend on iptables and least recommend ebtables, but I guess that's an implementation detail and could change in the future / on different platforms? --