While it's true that our virCommand subsystem is happy with
non-absolute paths, the dnsmasq capability code is not. For
instance, it does call stat() over the binary to learn its mtime
(and thus decide whether capabilities need to be fetched again or
not).
Therefore, when constructing the capabilities structure look up
the binary path. If DNSMASQ already contains an absolute path
then virFindFileInPath() will simply return a copy. But, if we
failed to find the binary in $PATH then do not report error.
Either the dnsmasqCapsNewEmpty() function is called from
dnsmasqCapsNewFromBinary() which will later validate the path and
return appropriate error, or the function is called from a test
suite (via dnsmasqCapsNewFromBuffer()) and the caps are parsed
from a fixed string.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
Diff to v1:
- Per my experiments we need a fallback case when DNSMASQ exists but is
not executable.
At any rate, this whole code could use cleanup, but let's save that for
after the release.
src/util/virdnsmasq.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
index d304929d51..8ddc2d0b78 100644
--- a/src/util/virdnsmasq.c
+++ b/src/util/virdnsmasq.c
@@ -703,12 +703,21 @@ static dnsmasqCaps *
dnsmasqCapsNewEmpty(void)
{
dnsmasqCaps *caps;
+ g_autofree char *binaryPath = NULL;
if (dnsmasqCapsInitialize() < 0)
return NULL;
if (!(caps = virObjectNew(dnsmasqCapsClass)))
return NULL;
- caps->binaryPath = g_strdup(DNSMASQ);
+
+ if (!(binaryPath = virFindFileInPath(DNSMASQ))) {
+ /* Don't report error here because we might be running
+ * from a test suite an initializing capabilities from
+ * a buffer (dnsmasqCapsNewFromBuffer()). */
+ binaryPath = g_strdup(DNSMASQ);
+ }
+
+ caps->binaryPath = g_steal_pointer(&binaryPath);
return caps;
}
--
2.34.1