[PATCH v1] virdnsmasq: fix runtime search for executable

Pavel Hrdina phrdina at redhat.com
Tue Aug 17 13:13:05 UTC 2021


On Wed, Aug 11, 2021 at 11:47:13AM +0200, Olaf Hering wrote:
> dnsmasq is an optional binary which does not neccessary exist during build.
>
> Signed-off-by: Olaf Hering <olaf at aepfle.de>
> ---
>  src/util/virdnsmasq.c | 28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)

Is there any error or incorrect behavior that you are trying to fix?
I did audit the code and within the virdnsmasq.c file we use the
binaryPath with virCommandRun() which will do this same check before
acutally execing, see virExec().

Pavel

> diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
> index f2f606913f..06d192c99d 100644
> --- a/src/util/virdnsmasq.c
> +++ b/src/util/virdnsmasq.c
> @@ -729,8 +729,26 @@ dnsmasqCapsRefreshInternal(dnsmasqCaps *caps, bool force)
>      return ret;
>  }
>  
> +static char *
> +dnsmasqGetBinaryPath(void)
> +{
> +    static const char binary[] = DNSMASQ;
> +    char *binary_path;
> +
> +    if (g_path_is_absolute(binary))
> +        return g_strdup(binary);
> +

No need for this check, virFindFileInPath calls g_find_program_in_path
which will do the correct thing if the path is already absolute.

> +    binary_path = virFindFileInPath(binary);
> +    if (!binary_path) {
> +        virReportSystemError(ENOENT, _("Cannot find '%s' in path"), binary);
> +        binary_path = g_strdup(binary);
> +    }
> +
> +    return binary_path;
> +}
> +
>  static dnsmasqCaps *
> -dnsmasqCapsNewEmpty(const char *binaryPath)
> +dnsmasqCapsNewEmpty(void)
>  {
>      dnsmasqCaps *caps;
>  
> @@ -739,14 +757,14 @@ dnsmasqCapsNewEmpty(const char *binaryPath)
>      if (!(caps = virObjectNew(dnsmasqCapsClass)))
>          return NULL;
>      caps->flags = virBitmapNew(DNSMASQ_CAPS_LAST);
> -    caps->binaryPath = g_strdup(binaryPath ? binaryPath : DNSMASQ);
> +    caps->binaryPath = dnsmasqGetBinaryPath();
>      return caps;
>  }
>  
>  dnsmasqCaps *
>  dnsmasqCapsNewFromBuffer(const char *buf)
>  {
> -    dnsmasqCaps *caps = dnsmasqCapsNewEmpty(DNSMASQ);
> +    dnsmasqCaps *caps = dnsmasqCapsNewEmpty();
>  
>      if (!caps)
>          return NULL;
> @@ -761,7 +779,7 @@ dnsmasqCapsNewFromBuffer(const char *buf)
>  dnsmasqCaps *
>  dnsmasqCapsNewFromBinary(void)
>  {
> -    dnsmasqCaps *caps = dnsmasqCapsNewEmpty(DNSMASQ);
> +    dnsmasqCaps *caps = dnsmasqCapsNewEmpty();
>  
>      if (!caps)
>          return NULL;
> @@ -776,7 +794,7 @@ dnsmasqCapsNewFromBinary(void)
>  const char *
>  dnsmasqCapsGetBinaryPath(dnsmasqCaps *caps)
>  {
> -    return caps ? caps->binaryPath : DNSMASQ;
> +    return caps ? caps->binaryPath : dnsmasqGetBinaryPath();
>  }
>  
>  unsigned long
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210817/d11739a5/attachment-0001.sig>


More information about the libvir-list mailing list