[libvirt] [PATCH v2] util: activate directory override when used from library

Daniel P. Berrangé berrange at redhat.com
Mon Sep 9 10:42:02 UTC 2019


On Mon, Sep 09, 2019 at 12:38:25PM +0200, Pavel Hrdina wrote:
> On Thu, Sep 05, 2019 at 11:52:09AM +0100, Daniel P. Berrangé wrote:
> > The Perl bindings for libvirt use the test driver for unit tests. This
> > tries to load the cpu_map/index.xml file, and when run from an
> > uninstalled build will fail.
> > 
> > The problem is that virFileActivateDirOverride is called by our various
> > binaries like libvirtd, virsh, but is not called when a 3rd party app
> > uses libvirt.so
> > 
> > To deal with this we allow the LIBVIRT_DIR_OVERRIDE=1 env variable to be
> > set and make virInitialize look for this. The 'run' script will set it,
> > so now build using this script to run against an uninstalled tree we
> > will correctly resolve files to the source tree.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> > Changed in v2:
> > 
> >  - Use a separate function for env var override
> > 
> >  run.in                        |  7 ++++++
> >  src/libvirt.c                 |  2 ++
> >  src/libvirt_private.syms      |  3 ++-
> >  src/locking/lock_daemon.c     |  2 +-
> >  src/logging/log_daemon.c      |  2 +-
> >  src/remote/remote_daemon.c    |  2 +-
> >  src/security/virt-aa-helper.c |  2 +-
> >  src/util/virfile.c            | 40 ++++++++++++++++++++++++++---------
> >  src/util/virfile.h            |  3 ++-
> >  tests/testutils.c             |  2 +-
> >  tools/virsh.c                 |  2 +-
> >  tools/virt-admin.c            |  2 +-
> >  12 files changed, 50 insertions(+), 19 deletions(-)
> > 
> > diff --git a/run.in b/run.in
> > index 9a1c6ea11a..ed946a0899 100644
> > --- a/run.in
> > +++ b/run.in
> > @@ -60,6 +60,13 @@ else
> >  fi
> >  export PKG_CONFIG_PATH
> >  
> > +# Ensure that any 3rd party apps using libvirt.so from
> > +# the build tree get files resolved to the build/source
> > +# tree too. Typically useful for language bindings
> > +# running tests against non-installed libvirt.
> > +LIBVIRT_DIR_OVERRIDE=1
> > +export LIBVIRT_DIR_OVERRIDE
> > +
> 
> This line wrapping looks a bit to aggressive :).
> 
> >  # This is a cheap way to find some use-after-free and uninitialized
> >  # read problems when using glibc.
> >  random_val="$(awk 'BEGIN{srand(); print 1+int(255*rand())}' < /dev/null)"
> > diff --git a/src/libvirt.c b/src/libvirt.c
> > index 9650aaa453..a1ecd8bacc 100644
> > --- a/src/libvirt.c
> > +++ b/src/libvirt.c
> > @@ -247,6 +247,8 @@ virGlobalInit(void)
> >          virErrorInitialize() < 0)
> >          goto error;
> >  
> > +    virFileActivateDirOverrideForLib();
> > +
> >      if (getuid() != geteuid() ||
> >          getgid() != getegid()) {
> >          virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index a34d92f5ef..21cd6a8ef7 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -1917,7 +1917,8 @@ virDirOpenQuiet;
> >  virDirRead;
> >  virFileAbsPath;
> >  virFileAccessibleAs;
> > -virFileActivateDirOverride;
> > +virFileActivateDirOverrideForLib;
> > +virFileActivateDirOverrideForProg;
> >  virFileBindMountDevice;
> >  virFileBuildPath;
> >  virFileCanonicalizePath;
> > diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
> > index ac242bf65c..edb61d74c0 100644
> > --- a/src/locking/lock_daemon.c
> > +++ b/src/locking/lock_daemon.c
> > @@ -1188,7 +1188,7 @@ int main(int argc, char **argv) {
> >          }
> >      }
> >  
> > -    virFileActivateDirOverride(argv[0]);
> > +    virFileActivateDirOverrideForProg(argv[0]);
> >  
> >      if (!(config = virLockDaemonConfigNew(privileged))) {
> >          VIR_ERROR(_("Can't create initial configuration"));
> > diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
> > index f74e900aea..85c58aaa7b 100644
> > --- a/src/logging/log_daemon.c
> > +++ b/src/logging/log_daemon.c
> > @@ -960,7 +960,7 @@ int main(int argc, char **argv) {
> >          }
> >      }
> >  
> > -    virFileActivateDirOverride(argv[0]);
> > +    virFileActivateDirOverrideForProg(argv[0]);
> >  
> >      if (!(config = virLogDaemonConfigNew(privileged))) {
> >          VIR_ERROR(_("Can't create initial configuration"));
> > diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
> > index 546328b24d..8cf9412128 100644
> > --- a/src/remote/remote_daemon.c
> > +++ b/src/remote/remote_daemon.c
> > @@ -1034,7 +1034,7 @@ int main(int argc, char **argv) {
> >  
> >      virUpdateSelfLastChanged(argv[0]);
> >  
> > -    virFileActivateDirOverride(argv[0]);
> > +    virFileActivateDirOverrideForProg(argv[0]);
> >  
> >      while (1) {
> >          int optidx = 0;
> > diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
> > index 3f9d775acc..326cfaf52a 100644
> > --- a/src/security/virt-aa-helper.c
> > +++ b/src/security/virt-aa-helper.c
> > @@ -1427,7 +1427,7 @@ main(int argc, char **argv)
> >          exit(EXIT_FAILURE);
> >      }
> >  
> > -    virFileActivateDirOverride(argv[0]);
> > +    virFileActivateDirOverrideForProg(argv[0]);
> >  
> >      /* Initialize the log system */
> >      virLogSetFromEnv();
> > diff --git a/src/util/virfile.c b/src/util/virfile.c
> > index 81a3c096eb..d9ac482435 100644
> > --- a/src/util/virfile.c
> > +++ b/src/util/virfile.c
> > @@ -1766,7 +1766,7 @@ virFileFindResource(const char *filename,
> >  
> >  
> >  /**
> > - * virFileActivateDirOverride:
> > + * virFileActivateDirOverrideForProg:
> >   * @argv0: argv[0] of the calling program
> >   *
> >   * Look at @argv0 and try to detect if running from
> > @@ -1774,20 +1774,40 @@ virFileFindResource(const char *filename,
> >   * on the binary name, or '/.libs/' in the path
> >   */
> >  void
> > -virFileActivateDirOverride(const char *argv0)
> > +virFileActivateDirOverrideForProg(const char *argv0)
> >  {
> > -    char *file = strrchr(argv0, '/');
> > -    if (!file || file[1] == '\0')
> > -        return;
> > -    file++;
> > -    if (STRPREFIX(file, "lt-") ||
> > -        strstr(argv0, "/.libs/")) {
> > -        useDirOverride = true;
> > -        VIR_DEBUG("Activating build dir override for %s", argv0);
> > +    if (argv0 == NULL) {
> > +        if (getenv("LIBVIRT_DIR_OVERRIDE") != NULL)
> > +            useDirOverride = true;
> > +    } else {
> > +        char *file = strrchr(argv0, '/');
> > +        if (!file || file[1] == '\0')
> > +            return;
> > +        file++;
> > +        if (STRPREFIX(file, "lt-") ||
> > +            strstr(argv0, "/.libs/")) {
> > +            useDirOverride = true;
> > +            VIR_DEBUG("Activating build dir override for %s", argv0);
> > +        }
> 
> This doesn't look right, probably leftover from V1 as this function
> should not be modified now with a new separate function for Lib.

Yes, of course. Dunno how I missed that :-(


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list