qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: Fam Zheng <famz@redhat.com>
Cc: peter.maydell@linaro.org, mjt@tls.msk.ru, qemu-devel@nongnu.org,
	stefanha@redhat.com, pbonzini@redhat.com, vilanova@ac.upc.edu,
	rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH v6 4/8] module: implement module loading function
Date: Wed, 11 Sep 2013 16:48:41 +0100	[thread overview]
Message-ID: <20130911154841.GD2293@redhat.com> (raw)
In-Reply-To: <1378906448-15834-5-git-send-email-famz@redhat.com>

On Wed, Sep 11, 2013 at 09:34:04PM +0800, Fam Zheng wrote:
> Added three types of modules:
> 
>     typedef enum {
>         MODULE_LOAD_BLOCK = 0,
>         MODULE_LOAD_UI,
>         MODULE_LOAD_NET,
>         MODULE_LOAD_MAX,
>     } module_load_type;
> 
> and their loading function:
> 
>     void module_load(module_load_type).
> 
> which loads all ".so" files in a subdir under "${PREFIX}/qemu/", e.g.
> "/usr/lib/qemu/block". Modules of each type should be loaded before
> respective subsystem initialization code.
> 
> Requires gmodule-2.0 from glib.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block.c               |  1 +
>  bsd-user/main.c       |  3 +++
>  configure             | 28 ++++++++++++++++++---------
>  include/qemu/module.h |  9 +++++++++
>  linux-user/main.c     |  3 +++
>  scripts/create_config |  7 +++++++
>  util/module.c         | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  vl.c                  |  2 ++
>  8 files changed, 97 insertions(+), 9 deletions(-)

After this change is applied, if you don't pass --enable-modules to
confoigure, then QEMU spams stdout at startup

  Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/ui/
  Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/net/
  Failed to open dir /home/berrange/usr/qemu-git/lib/qemu/block/


If I do enable modules, QEMU still complains about the ui/ & net/
directories not existing.



> +    dp = opendir(path);
> +    if (!dp) {
> +        fprintf(stderr, "Failed to open dir %s\n", path);
> +        return;
> +    }
> +    for (ep = readdir(dp); ep; ep = readdir(dp)) {

By dynamically loading all modules found in the directory, with
not validity checks this opens the doorway for 3rd party vendors
to drop-in closed source modules to QEMU binaries.

Anthony's spec (http://wiki.qemu.org/Features/Modules) had said

 "What this is not

    A mechanism to support third party extensions to QEMU or
    out of tree drivers/features
    A stable interface
    A GPL barrier 

  This system should not be (ab)used to allow 3rd-party modules
  to be loaded into qemu, especially to "work around" GPL restrictions.
  In order to ensure this, the modules system should be built in a way
  to allow loading only modules which were built together with qemu,
  by adding, for example, hashes of current build to the main exported
  symbols."


We know the precise list of valid modules when building QEMU,
so IMHO, this should just explicitly load each known module
name, and *not* readdir. Also it should do something along the
lines suggested their of poisoning exported symbols with a
build hash to guarantee the modules loaded match the original
binary and that the symbols change on every rebuild.

The latter is important even ignoring the 3rd party module
question, since it ensures developers/users don't accidently
run with mis-match QEMU and module builds, which could lead
to some very hard to diagnose bugs / behaviour.

> +        int len = strlen(ep->d_name);
> +        if (len > suf_len &&
> +                !strcmp(&ep->d_name[len - suf_len], dsosuf)) {
> +            fname = g_strdup_printf("%s%s", path, ep->d_name);
> +            g_module = g_module_open(fname,
> +                                     G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
> +            if (!g_module) {
> +                fprintf(stderr, "Failed to open module file %s\n",
> +                        g_module_error());
> +                g_free(fname);
> +                continue;
> +            }
> +            g_free(fname);
> +        }
> +    }
> +}


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

  reply	other threads:[~2013-09-11 15:49 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-11 13:34 [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 1/8] make.rule: fix $(obj) to a real relative path Fam Zheng
2013-09-11 13:41   ` Paolo Bonzini
2013-09-12  2:32     ` Fam Zheng
2013-09-11 14:59   ` Daniel P. Berrange
2013-09-12  1:57     ` Fam Zheng
2013-09-12  2:22     ` Fam Zheng
2013-09-11 16:38   ` Peter Maydell
2013-09-11 16:40     ` Paolo Bonzini
2013-09-11 16:43       ` Peter Maydell
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 2/8] rule.mak: allow per object cflags and libs Fam Zheng
2013-09-11 13:43   ` Paolo Bonzini
2013-09-12  2:52     ` Fam Zheng
2013-09-12  6:34       ` Paolo Bonzini
2013-09-12  7:12         ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 3/8] Makefile: introduce common-obj-m and block-obj-m for DSO Fam Zheng
2013-09-11 20:01   ` Peter Maydell
2013-09-12  2:48     ` Fam Zheng
2013-09-12  2:50   ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 4/8] module: implement module loading function Fam Zheng
2013-09-11 15:48   ` Daniel P. Berrange [this message]
2013-09-11 18:33     ` Alex Bligh
2013-09-11 18:46     ` Richard Henderson
2013-09-12  3:02       ` Fam Zheng
2013-09-12  5:36         ` Michael Tokarev
2013-09-12  9:13           ` Daniel P. Berrange
2013-09-12 11:59           ` Eric Blake
2013-09-12 12:44             ` Daniel P. Berrange
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 5/8] configure: introduce --enable-modules Fam Zheng
2013-09-11 13:46   ` Paolo Bonzini
2013-09-12  2:06     ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 6/8] Makefile: install modules with "make install" Fam Zheng
2013-09-11 13:50   ` Paolo Bonzini
2013-09-12  2:00     ` Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 7/8] .gitignore: ignore module related files (dll, so, mo) Fam Zheng
2013-09-11 13:34 ` [Qemu-devel] [PATCH v6 8/8] block: convert block drivers linked with libs to modules Fam Zheng
2013-09-11 15:41   ` Daniel P. Berrange
2013-09-12  2:07     ` Fam Zheng
2013-09-11 16:26 ` [Qemu-devel] [PATCH v6 0/8] Shared Library Module Support Peter Maydell
2013-09-12  3:08   ` Fam Zheng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130911154841.GD2293@redhat.com \
    --to=berrange@redhat.com \
    --cc=famz@redhat.com \
    --cc=mjt@tls.msk.ru \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=stefanha@redhat.com \
    --cc=vilanova@ac.upc.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).